All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 00/25] contrib: cleanup
@ 2014-05-09  0:58 Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 02/25] contrib: remove 'hg-to-git' Felipe Contreras
                   ` (25 more replies)
  0 siblings, 26 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

Let us be honest, the vast majority of tools in 'contrib/' have no chance of
ever graduating, so let's remove them.

The vast majority of tools don't have documentation or tests, and aren't even
maintained.

A few, like 'remote-helpers', won't graduate even if they are perfect. These
tools apparently should live out-of-tree.

After the cleanup, the only tools that remain are 'completion',
'credential' and 'subtree', which might eventually graduate.


Felipe Contreras (25):
  Remove remote-helpers
  contrib: remove 'hg-to-git'
  contrib: remove 'stats'
  contrib: remove 'buildsystems'
  contrib: remove 'convert-objects'
  contrib: remove 'diffall'
  contrib: remove 'git-jump'
  contrib: remove 'git-shell-commands'
  contrib: remove 'gitview'
  contrib: reomve 'thunderbird-patch-inline'
  contrib: remove 'workdir'
  contrib: remove 'vim'
  contrib: remove 'svn-fe'
  contrib: remove 'rerere-train'
  contrib: remove 'remotes2config'
  contrib: remove 'persistent-https'
  contrib: remove 'git-resurrect'
  contrib: remove 'emacs'
  contrib: remove 'diff-highlight'
  contrib: remove 'contacts'
  contrib: remove 'examples'
  contrib: remove 'fast-import'
  contrib: remove 'hooks/multimail'
  contrib: remove 'hooks'
  contrib: remove 'mw-to-git'

 contrib/buildsystems/Generators.pm                 |   42 -
 contrib/buildsystems/Generators/QMake.pm           |  189 --
 contrib/buildsystems/Generators/Vcproj.pm          |  626 -----
 contrib/buildsystems/engine.pl                     |  359 ---
 contrib/buildsystems/generate                      |   29 -
 contrib/buildsystems/parse.pl                      |  228 --
 contrib/contacts/git-contacts                      |  203 --
 contrib/contacts/git-contacts.txt                  |   94 -
 contrib/convert-objects/convert-objects.c          |  329 ---
 contrib/convert-objects/git-convert-objects.txt    |   29 -
 contrib/diff-highlight/README                      |  152 --
 contrib/diff-highlight/diff-highlight              |  173 --
 contrib/diffall/README                             |   31 -
 contrib/diffall/git-diffall                        |  257 --
 contrib/emacs/.gitignore                           |    1 -
 contrib/emacs/Makefile                             |   21 -
 contrib/emacs/README                               |   39 -
 contrib/emacs/git-blame.el                         |  484 ----
 contrib/emacs/git.el                               | 1705 -------------
 contrib/examples/README                            |    3 -
 contrib/examples/builtin-fetch--tool.c             |  575 -----
 contrib/examples/git-checkout.sh                   |  302 ---
 contrib/examples/git-clean.sh                      |  118 -
 contrib/examples/git-clone.sh                      |  525 ----
 contrib/examples/git-commit.sh                     |  639 -----
 contrib/examples/git-fetch.sh                      |  379 ---
 contrib/examples/git-gc.sh                         |   37 -
 contrib/examples/git-log.sh                        |   15 -
 contrib/examples/git-ls-remote.sh                  |  142 --
 contrib/examples/git-merge-ours.sh                 |   14 -
 contrib/examples/git-merge.sh                      |  620 -----
 contrib/examples/git-notes.sh                      |  121 -
 contrib/examples/git-remote.perl                   |  474 ----
 contrib/examples/git-repack.sh                     |  194 --
 contrib/examples/git-rerere.perl                   |  284 ---
 contrib/examples/git-reset.sh                      |  106 -
 contrib/examples/git-resolve.sh                    |  112 -
 contrib/examples/git-revert.sh                     |  207 --
 contrib/examples/git-svnimport.perl                |  976 --------
 contrib/examples/git-svnimport.txt                 |  179 --
 contrib/examples/git-tag.sh                        |  205 --
 contrib/examples/git-verify-tag.sh                 |   45 -
 contrib/examples/git-whatchanged.sh                |   28 -
 contrib/fast-import/git-import.perl                |   64 -
 contrib/fast-import/git-import.sh                  |   38 -
 contrib/fast-import/git-p4.README                  |   12 -
 contrib/fast-import/import-directories.perl        |  417 ----
 contrib/fast-import/import-tars.perl               |  189 --
 contrib/fast-import/import-zips.py                 |   78 -
 contrib/git-jump/README                            |   92 -
 contrib/git-jump/git-jump                          |   69 -
 contrib/git-resurrect.sh                           |  182 --
 contrib/git-shell-commands/README                  |   18 -
 contrib/git-shell-commands/help                    |   18 -
 contrib/git-shell-commands/list                    |   10 -
 contrib/gitview/gitview                            | 1305 ----------
 contrib/gitview/gitview.txt                        |   57 -
 contrib/hg-to-git/hg-to-git.py                     |  255 --
 contrib/hg-to-git/hg-to-git.txt                    |   21 -
 contrib/hooks/multimail/CHANGES                    |   33 -
 contrib/hooks/multimail/README                     |  500 ----
 contrib/hooks/multimail/README.Git                 |   15 -
 .../README.migrate-from-post-receive-email         |  145 --
 contrib/hooks/multimail/git_multimail.py           | 2539 --------------------
 contrib/hooks/multimail/migrate-mailhook-config    |  269 ---
 contrib/hooks/multimail/post-receive               |   90 -
 contrib/hooks/post-receive-email                   |  759 ------
 contrib/hooks/pre-auto-gc-battery                  |   42 -
 contrib/hooks/setgitperms.perl                     |  214 --
 contrib/hooks/update-paranoid                      |  421 ----
 contrib/mw-to-git/.gitignore                       |    2 -
 contrib/mw-to-git/.perlcriticrc                    |   28 -
 contrib/mw-to-git/Git/Mediawiki.pm                 |  100 -
 contrib/mw-to-git/Makefile                         |   57 -
 contrib/mw-to-git/bin-wrapper/git                  |   14 -
 contrib/mw-to-git/git-mw.perl                      |  368 ---
 contrib/mw-to-git/git-remote-mediawiki.perl        | 1338 -----------
 contrib/mw-to-git/git-remote-mediawiki.txt         |    7 -
 contrib/mw-to-git/t/.gitignore                     |    4 -
 contrib/mw-to-git/t/Makefile                       |   31 -
 contrib/mw-to-git/t/README                         |  124 -
 contrib/mw-to-git/t/install-wiki.sh                |   55 -
 contrib/mw-to-git/t/install-wiki/.gitignore        |    1 -
 contrib/mw-to-git/t/install-wiki/LocalSettings.php |  129 -
 contrib/mw-to-git/t/install-wiki/db_install.php    |  120 -
 contrib/mw-to-git/t/push-pull-tests.sh             |  144 --
 contrib/mw-to-git/t/t9360-mw-to-git-clone.sh       |  257 --
 contrib/mw-to-git/t/t9361-mw-to-git-push-pull.sh   |   24 -
 contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh        |  347 ---
 .../mw-to-git/t/t9363-mw-to-git-export-import.sh   |  217 --
 contrib/mw-to-git/t/t9364-pull-by-rev.sh           |   17 -
 contrib/mw-to-git/t/t9365-continuing-queries.sh    |   23 -
 contrib/mw-to-git/t/test-gitmw-lib.sh              |  432 ----
 contrib/mw-to-git/t/test-gitmw.pl                  |  225 --
 contrib/mw-to-git/t/test.config                    |   37 -
 contrib/persistent-https/LICENSE                   |  202 --
 contrib/persistent-https/Makefile                  |   38 -
 contrib/persistent-https/README                    |   62 -
 contrib/persistent-https/client.go                 |  189 --
 contrib/persistent-https/main.go                   |   82 -
 contrib/persistent-https/proxy.go                  |  190 --
 contrib/persistent-https/socket.go                 |   97 -
 contrib/remotes2config.sh                          |   33 -
 contrib/rerere-train.sh                            |   52 -
 contrib/stats/git-common-hash                      |   26 -
 contrib/stats/mailmap.pl                           |   70 -
 contrib/stats/packinfo.pl                          |  212 --
 contrib/svn-fe/.gitignore                          |    4 -
 contrib/svn-fe/Makefile                            |   63 -
 contrib/svn-fe/svn-fe.c                            |   18 -
 contrib/svn-fe/svn-fe.txt                          |   71 -
 contrib/svn-fe/svnrdump_sim.py                     |   57 -
 contrib/thunderbird-patch-inline/README            |   20 -
 contrib/thunderbird-patch-inline/appp.sh           |   55 -
 contrib/vim/README                                 |   22 -
 contrib/workdir/git-new-workdir                    |   82 -
 git-remote-bzr.py                                  |  983 --------
 git-remote-hg.py                                   | 1258 ----------
 t/t5810-remote-hg.sh                               |  847 -------
 t/t5811-remote-hg-bidi.sh                          |  242 --
 t/t5812-remote-hg-hg-git.sh                        |  541 -----
 t/t5820-remote-bzr.sh                              |  437 ----
 122 files changed, 29197 deletions(-)
 delete mode 100644 contrib/buildsystems/Generators.pm
 delete mode 100644 contrib/buildsystems/Generators/QMake.pm
 delete mode 100644 contrib/buildsystems/Generators/Vcproj.pm
 delete mode 100755 contrib/buildsystems/engine.pl
 delete mode 100755 contrib/buildsystems/generate
 delete mode 100755 contrib/buildsystems/parse.pl
 delete mode 100755 contrib/contacts/git-contacts
 delete mode 100644 contrib/contacts/git-contacts.txt
 delete mode 100644 contrib/convert-objects/convert-objects.c
 delete mode 100644 contrib/convert-objects/git-convert-objects.txt
 delete mode 100644 contrib/diff-highlight/README
 delete mode 100755 contrib/diff-highlight/diff-highlight
 delete mode 100644 contrib/diffall/README
 delete mode 100755 contrib/diffall/git-diffall
 delete mode 100644 contrib/emacs/.gitignore
 delete mode 100644 contrib/emacs/Makefile
 delete mode 100644 contrib/emacs/README
 delete mode 100644 contrib/emacs/git-blame.el
 delete mode 100644 contrib/emacs/git.el
 delete mode 100644 contrib/examples/README
 delete mode 100644 contrib/examples/builtin-fetch--tool.c
 delete mode 100755 contrib/examples/git-checkout.sh
 delete mode 100755 contrib/examples/git-clean.sh
 delete mode 100755 contrib/examples/git-clone.sh
 delete mode 100755 contrib/examples/git-commit.sh
 delete mode 100755 contrib/examples/git-fetch.sh
 delete mode 100755 contrib/examples/git-gc.sh
 delete mode 100755 contrib/examples/git-log.sh
 delete mode 100755 contrib/examples/git-ls-remote.sh
 delete mode 100755 contrib/examples/git-merge-ours.sh
 delete mode 100755 contrib/examples/git-merge.sh
 delete mode 100755 contrib/examples/git-notes.sh
 delete mode 100755 contrib/examples/git-remote.perl
 delete mode 100755 contrib/examples/git-repack.sh
 delete mode 100755 contrib/examples/git-rerere.perl
 delete mode 100755 contrib/examples/git-reset.sh
 delete mode 100755 contrib/examples/git-resolve.sh
 delete mode 100755 contrib/examples/git-revert.sh
 delete mode 100755 contrib/examples/git-svnimport.perl
 delete mode 100644 contrib/examples/git-svnimport.txt
 delete mode 100755 contrib/examples/git-tag.sh
 delete mode 100755 contrib/examples/git-verify-tag.sh
 delete mode 100755 contrib/examples/git-whatchanged.sh
 delete mode 100755 contrib/fast-import/git-import.perl
 delete mode 100755 contrib/fast-import/git-import.sh
 delete mode 100644 contrib/fast-import/git-p4.README
 delete mode 100755 contrib/fast-import/import-directories.perl
 delete mode 100755 contrib/fast-import/import-tars.perl
 delete mode 100755 contrib/fast-import/import-zips.py
 delete mode 100644 contrib/git-jump/README
 delete mode 100755 contrib/git-jump/git-jump
 delete mode 100755 contrib/git-resurrect.sh
 delete mode 100644 contrib/git-shell-commands/README
 delete mode 100755 contrib/git-shell-commands/help
 delete mode 100755 contrib/git-shell-commands/list
 delete mode 100755 contrib/gitview/gitview
 delete mode 100644 contrib/gitview/gitview.txt
 delete mode 100755 contrib/hg-to-git/hg-to-git.py
 delete mode 100644 contrib/hg-to-git/hg-to-git.txt
 delete mode 100644 contrib/hooks/multimail/CHANGES
 delete mode 100644 contrib/hooks/multimail/README
 delete mode 100644 contrib/hooks/multimail/README.Git
 delete mode 100644 contrib/hooks/multimail/README.migrate-from-post-receive-email
 delete mode 100755 contrib/hooks/multimail/git_multimail.py
 delete mode 100755 contrib/hooks/multimail/migrate-mailhook-config
 delete mode 100755 contrib/hooks/multimail/post-receive
 delete mode 100755 contrib/hooks/post-receive-email
 delete mode 100755 contrib/hooks/pre-auto-gc-battery
 delete mode 100755 contrib/hooks/setgitperms.perl
 delete mode 100755 contrib/hooks/update-paranoid
 delete mode 100644 contrib/mw-to-git/.gitignore
 delete mode 100644 contrib/mw-to-git/.perlcriticrc
 delete mode 100644 contrib/mw-to-git/Git/Mediawiki.pm
 delete mode 100644 contrib/mw-to-git/Makefile
 delete mode 100755 contrib/mw-to-git/bin-wrapper/git
 delete mode 100755 contrib/mw-to-git/git-mw.perl
 delete mode 100755 contrib/mw-to-git/git-remote-mediawiki.perl
 delete mode 100644 contrib/mw-to-git/git-remote-mediawiki.txt
 delete mode 100644 contrib/mw-to-git/t/.gitignore
 delete mode 100644 contrib/mw-to-git/t/Makefile
 delete mode 100644 contrib/mw-to-git/t/README
 delete mode 100755 contrib/mw-to-git/t/install-wiki.sh
 delete mode 100644 contrib/mw-to-git/t/install-wiki/.gitignore
 delete mode 100644 contrib/mw-to-git/t/install-wiki/LocalSettings.php
 delete mode 100644 contrib/mw-to-git/t/install-wiki/db_install.php
 delete mode 100644 contrib/mw-to-git/t/push-pull-tests.sh
 delete mode 100755 contrib/mw-to-git/t/t9360-mw-to-git-clone.sh
 delete mode 100755 contrib/mw-to-git/t/t9361-mw-to-git-push-pull.sh
 delete mode 100755 contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
 delete mode 100755 contrib/mw-to-git/t/t9363-mw-to-git-export-import.sh
 delete mode 100755 contrib/mw-to-git/t/t9364-pull-by-rev.sh
 delete mode 100755 contrib/mw-to-git/t/t9365-continuing-queries.sh
 delete mode 100755 contrib/mw-to-git/t/test-gitmw-lib.sh
 delete mode 100755 contrib/mw-to-git/t/test-gitmw.pl
 delete mode 100644 contrib/mw-to-git/t/test.config
 delete mode 100644 contrib/persistent-https/LICENSE
 delete mode 100644 contrib/persistent-https/Makefile
 delete mode 100644 contrib/persistent-https/README
 delete mode 100644 contrib/persistent-https/client.go
 delete mode 100644 contrib/persistent-https/main.go
 delete mode 100644 contrib/persistent-https/proxy.go
 delete mode 100644 contrib/persistent-https/socket.go
 delete mode 100755 contrib/remotes2config.sh
 delete mode 100755 contrib/rerere-train.sh
 delete mode 100755 contrib/stats/git-common-hash
 delete mode 100755 contrib/stats/mailmap.pl
 delete mode 100755 contrib/stats/packinfo.pl
 delete mode 100644 contrib/svn-fe/.gitignore
 delete mode 100644 contrib/svn-fe/Makefile
 delete mode 100644 contrib/svn-fe/svn-fe.c
 delete mode 100644 contrib/svn-fe/svn-fe.txt
 delete mode 100755 contrib/svn-fe/svnrdump_sim.py
 delete mode 100644 contrib/thunderbird-patch-inline/README
 delete mode 100755 contrib/thunderbird-patch-inline/appp.sh
 delete mode 100644 contrib/vim/README
 delete mode 100755 contrib/workdir/git-new-workdir
 delete mode 100755 git-remote-bzr.py
 delete mode 100755 git-remote-hg.py
 delete mode 100755 t/t5810-remote-hg.sh
 delete mode 100755 t/t5811-remote-hg-bidi.sh
 delete mode 100755 t/t5812-remote-hg-hg-git.sh
 delete mode 100755 t/t5820-remote-bzr.sh

-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply	[flat|nested] 83+ messages in thread

* [PATCH v1 02/25] contrib: remove 'hg-to-git'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  6:44   ` Miklos Vajna
  2014-05-09  0:58 ` [PATCH v1 03/25] contrib: remove 'stats' Felipe Contreras
                   ` (24 subsequent siblings)
  25 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras, Miklos Vajna

There hasn't been any real activity on it since 2010.

Plus there are better out-of-tree tools.

No tests and no real documentation either.

Cc: Miklos Vajna <vmiklos@frugalware.org>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/hg-to-git/hg-to-git.py  | 255 ----------------------------------------
 contrib/hg-to-git/hg-to-git.txt |  21 ----
 2 files changed, 276 deletions(-)
 delete mode 100755 contrib/hg-to-git/hg-to-git.py
 delete mode 100644 contrib/hg-to-git/hg-to-git.txt

diff --git a/contrib/hg-to-git/hg-to-git.py b/contrib/hg-to-git/hg-to-git.py
deleted file mode 100755
index 60dec86..0000000
--- a/contrib/hg-to-git/hg-to-git.py
+++ /dev/null
@@ -1,255 +0,0 @@
-#!/usr/bin/env python
-
-""" hg-to-git.py - A Mercurial to GIT converter
-
-    Copyright (C)2007 Stelian Pop <stelian@popies.net>
-
-    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, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-"""
-
-import os, os.path, sys
-import tempfile, pickle, getopt
-import re
-
-if sys.hexversion < 0x02030000:
-   # The behavior of the pickle module changed significantly in 2.3
-   sys.stderr.write("hg-to-git.py: requires Python 2.3 or later.\n")
-   sys.exit(1)
-
-# Maps hg version -> git version
-hgvers = {}
-# List of children for each hg revision
-hgchildren = {}
-# List of parents for each hg revision
-hgparents = {}
-# Current branch for each hg revision
-hgbranch = {}
-# Number of new changesets converted from hg
-hgnewcsets = 0
-
-#------------------------------------------------------------------------------
-
-def usage():
-
-        print """\
-%s: [OPTIONS] <hgprj>
-
-options:
-    -s, --gitstate=FILE: name of the state to be saved/read
-                         for incrementals
-    -n, --nrepack=INT:   number of changesets that will trigger
-                         a repack (default=0, -1 to deactivate)
-    -v, --verbose:       be verbose
-
-required:
-    hgprj:  name of the HG project to import (directory)
-""" % sys.argv[0]
-
-#------------------------------------------------------------------------------
-
-def getgitenv(user, date):
-    env = ''
-    elems = re.compile('(.*?)\s+<(.*)>').match(user)
-    if elems:
-        env += 'export GIT_AUTHOR_NAME="%s" ;' % elems.group(1)
-        env += 'export GIT_COMMITTER_NAME="%s" ;' % elems.group(1)
-        env += 'export GIT_AUTHOR_EMAIL="%s" ;' % elems.group(2)
-        env += 'export GIT_COMMITTER_EMAIL="%s" ;' % elems.group(2)
-    else:
-        env += 'export GIT_AUTHOR_NAME="%s" ;' % user
-        env += 'export GIT_COMMITTER_NAME="%s" ;' % user
-        env += 'export GIT_AUTHOR_EMAIL= ;'
-        env += 'export GIT_COMMITTER_EMAIL= ;'
-
-    env += 'export GIT_AUTHOR_DATE="%s" ;' % date
-    env += 'export GIT_COMMITTER_DATE="%s" ;' % date
-    return env
-
-#------------------------------------------------------------------------------
-
-state = ''
-opt_nrepack = 0
-verbose = False
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:], 's:t:n:v', ['gitstate=', 'tempdir=', 'nrepack=', 'verbose'])
-    for o, a in opts:
-        if o in ('-s', '--gitstate'):
-            state = a
-            state = os.path.abspath(state)
-        if o in ('-n', '--nrepack'):
-            opt_nrepack = int(a)
-        if o in ('-v', '--verbose'):
-            verbose = True
-    if len(args) != 1:
-        raise Exception('params')
-except:
-    usage()
-    sys.exit(1)
-
-hgprj = args[0]
-os.chdir(hgprj)
-
-if state:
-    if os.path.exists(state):
-        if verbose:
-            print 'State does exist, reading'
-        f = open(state, 'r')
-        hgvers = pickle.load(f)
-    else:
-        print 'State does not exist, first run'
-
-sock = os.popen('hg tip --template "{rev}"')
-tip = sock.read()
-if sock.close():
-    sys.exit(1)
-if verbose:
-    print 'tip is', tip
-
-# Calculate the branches
-if verbose:
-    print 'analysing the branches...'
-hgchildren["0"] = ()
-hgparents["0"] = (None, None)
-hgbranch["0"] = "master"
-for cset in range(1, int(tip) + 1):
-    hgchildren[str(cset)] = ()
-    prnts = os.popen('hg log -r %d --template "{parents}"' % cset).read().strip().split(' ')
-    prnts = map(lambda x: x[:x.find(':')], prnts)
-    if prnts[0] != '':
-        parent = prnts[0].strip()
-    else:
-        parent = str(cset - 1)
-    hgchildren[parent] += ( str(cset), )
-    if len(prnts) > 1:
-        mparent = prnts[1].strip()
-        hgchildren[mparent] += ( str(cset), )
-    else:
-        mparent = None
-
-    hgparents[str(cset)] = (parent, mparent)
-
-    if mparent:
-        # For merge changesets, take either one, preferably the 'master' branch
-        if hgbranch[mparent] == 'master':
-            hgbranch[str(cset)] = 'master'
-        else:
-            hgbranch[str(cset)] = hgbranch[parent]
-    else:
-        # Normal changesets
-        # For first children, take the parent branch, for the others create a new branch
-        if hgchildren[parent][0] == str(cset):
-            hgbranch[str(cset)] = hgbranch[parent]
-        else:
-            hgbranch[str(cset)] = "branch-" + str(cset)
-
-if not hgvers.has_key("0"):
-    print 'creating repository'
-    os.system('git init')
-
-# loop through every hg changeset
-for cset in range(int(tip) + 1):
-
-    # incremental, already seen
-    if hgvers.has_key(str(cset)):
-        continue
-    hgnewcsets += 1
-
-    # get info
-    log_data = os.popen('hg log -r %d --template "{tags}\n{date|date}\n{author}\n"' % cset).readlines()
-    tag = log_data[0].strip()
-    date = log_data[1].strip()
-    user = log_data[2].strip()
-    parent = hgparents[str(cset)][0]
-    mparent = hgparents[str(cset)][1]
-
-    #get comment
-    (fdcomment, filecomment) = tempfile.mkstemp()
-    csetcomment = os.popen('hg log -r %d --template "{desc}"' % cset).read().strip()
-    os.write(fdcomment, csetcomment)
-    os.close(fdcomment)
-
-    print '-----------------------------------------'
-    print 'cset:', cset
-    print 'branch:', hgbranch[str(cset)]
-    print 'user:', user
-    print 'date:', date
-    print 'comment:', csetcomment
-    if parent:
-	print 'parent:', parent
-    if mparent:
-        print 'mparent:', mparent
-    if tag:
-        print 'tag:', tag
-    print '-----------------------------------------'
-
-    # checkout the parent if necessary
-    if cset != 0:
-        if hgbranch[str(cset)] == "branch-" + str(cset):
-            print 'creating new branch', hgbranch[str(cset)]
-            os.system('git checkout -b %s %s' % (hgbranch[str(cset)], hgvers[parent]))
-        else:
-            print 'checking out branch', hgbranch[str(cset)]
-            os.system('git checkout %s' % hgbranch[str(cset)])
-
-    # merge
-    if mparent:
-        if hgbranch[parent] == hgbranch[str(cset)]:
-            otherbranch = hgbranch[mparent]
-        else:
-            otherbranch = hgbranch[parent]
-        print 'merging', otherbranch, 'into', hgbranch[str(cset)]
-        os.system(getgitenv(user, date) + 'git merge --no-commit -s ours "" %s %s' % (hgbranch[str(cset)], otherbranch))
-
-    # remove everything except .git and .hg directories
-    os.system('find . \( -path "./.hg" -o -path "./.git" \) -prune -o ! -name "." -print | xargs rm -rf')
-
-    # repopulate with checkouted files
-    os.system('hg update -C %d' % cset)
-
-    # add new files
-    os.system('git ls-files -x .hg --others | git update-index --add --stdin')
-    # delete removed files
-    os.system('git ls-files -x .hg --deleted | git update-index --remove --stdin')
-
-    # commit
-    os.system(getgitenv(user, date) + 'git commit --allow-empty --allow-empty-message -a -F %s' % filecomment)
-    os.unlink(filecomment)
-
-    # tag
-    if tag and tag != 'tip':
-        os.system(getgitenv(user, date) + 'git tag %s' % tag)
-
-    # delete branch if not used anymore...
-    if mparent and len(hgchildren[str(cset)]):
-        print "Deleting unused branch:", otherbranch
-        os.system('git branch -d %s' % otherbranch)
-
-    # retrieve and record the version
-    vvv = os.popen('git show --quiet --pretty=format:%H').read()
-    print 'record', cset, '->', vvv
-    hgvers[str(cset)] = vvv
-
-if hgnewcsets >= opt_nrepack and opt_nrepack != -1:
-    os.system('git repack -a -d')
-
-# write the state for incrementals
-if state:
-    if verbose:
-        print 'Writing state'
-    f = open(state, 'w')
-    pickle.dump(hgvers, f)
-
-# vim: et ts=8 sw=4 sts=4
diff --git a/contrib/hg-to-git/hg-to-git.txt b/contrib/hg-to-git/hg-to-git.txt
deleted file mode 100644
index 91f8fe6..0000000
--- a/contrib/hg-to-git/hg-to-git.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-hg-to-git.py is able to convert a Mercurial repository into a git one,
-and preserves the branches in the process (unlike tailor)
-
-hg-to-git.py can probably be greatly improved (it's a rather crude
-combination of shell and python) but it does already work quite well for
-me. Features:
-	- supports incremental conversion
-	  (for keeping a git repo in sync with a hg one)
-        - supports hg branches
-        - converts hg tags
-
-Note that the git repository will be created 'in place' (at the same
-location as the source hg repo). You will have to manually remove the
-'.hg' directory after the conversion.
-
-Also note that the incremental conversion uses 'simple' hg changesets
-identifiers (ordinals, as opposed to SHA-1 ids), and since these ids
-are not stable across different repositories the hg-to-git.py state file
-is forever tied to one hg repository.
-
-Stelian Pop <stelian@popies.net>
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 03/25] contrib: remove 'stats'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 02/25] contrib: remove 'hg-to-git' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 04/25] contrib: remove 'buildsystems' Felipe Contreras
                   ` (23 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No real activity since 2012 (or ever), no tests, no documentation.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/stats/git-common-hash |  26 ------
 contrib/stats/mailmap.pl      |  70 --------------
 contrib/stats/packinfo.pl     | 212 ------------------------------------------
 3 files changed, 308 deletions(-)
 delete mode 100755 contrib/stats/git-common-hash
 delete mode 100755 contrib/stats/mailmap.pl
 delete mode 100755 contrib/stats/packinfo.pl

diff --git a/contrib/stats/git-common-hash b/contrib/stats/git-common-hash
deleted file mode 100755
index e27fd08..0000000
--- a/contrib/stats/git-common-hash
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh
-
-# This script displays the distribution of longest common hash prefixes.
-# This can be used to determine the minimum prefix length to use
-# for object names to be unique.
-
-git rev-list --objects --all | sort | perl -lne '
-  substr($_, 40) = "";
-  # uncomment next line for a distribution of bits instead of hex chars
-  # $_ = unpack("B*",pack("H*",$_));
-  if (defined $p) {
-    ($p ^ $_) =~ /^(\0*)/;
-    $common = length $1;
-    if (defined $pcommon) {
-      $count[$pcommon > $common ? $pcommon : $common]++;
-    } else {
-      $count[$common]++; # first item
-    }
-  }
-  $p = $_;
-  $pcommon = $common;
-  END {
-    $count[$common]++; # last item
-    print "$_: $count[$_]" for 0..$#count;
-  }
-'
diff --git a/contrib/stats/mailmap.pl b/contrib/stats/mailmap.pl
deleted file mode 100755
index 9513f5e..0000000
--- a/contrib/stats/mailmap.pl
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/perl
-
-use warnings 'all';
-use strict;
-use Getopt::Long;
-
-my $match_emails;
-my $match_names;
-my $order_by = 'count';
-Getopt::Long::Configure(qw(bundling));
-GetOptions(
-	'emails|e!' => \$match_emails,
-	'names|n!'  => \$match_names,
-	'count|c'   => sub { $order_by = 'count' },
-	'time|t'    => sub { $order_by = 'stamp' },
-) or exit 1;
-$match_emails = 1 unless $match_names;
-
-my $email = {};
-my $name = {};
-
-open(my $fh, '-|', "git log --format='%at <%aE> %aN'");
-while(<$fh>) {
-	my ($t, $e, $n) = /(\S+) <(\S+)> (.*)/;
-	mark($email, $e, $n, $t);
-	mark($name, $n, $e, $t);
-}
-close($fh);
-
-if ($match_emails) {
-	foreach my $e (dups($email)) {
-		foreach my $n (vals($email->{$e})) {
-			show($n, $e, $email->{$e}->{$n});
-		}
-		print "\n";
-	}
-}
-if ($match_names) {
-	foreach my $n (dups($name)) {
-		foreach my $e (vals($name->{$n})) {
-			show($n, $e, $name->{$n}->{$e});
-		}
-		print "\n";
-	}
-}
-exit 0;
-
-sub mark {
-	my ($h, $k, $v, $t) = @_;
-	my $e = $h->{$k}->{$v} ||= { count => 0, stamp => 0 };
-	$e->{count}++;
-	$e->{stamp} = $t unless $t < $e->{stamp};
-}
-
-sub dups {
-	my $h = shift;
-	return grep { keys($h->{$_}) > 1 } keys($h);
-}
-
-sub vals {
-	my $h = shift;
-	return sort {
-		$h->{$b}->{$order_by} <=> $h->{$a}->{$order_by}
-	} keys($h);
-}
-
-sub show {
-	my ($n, $e, $h) = @_;
-	print "$n <$e> ($h->{$order_by})\n";
-}
diff --git a/contrib/stats/packinfo.pl b/contrib/stats/packinfo.pl
deleted file mode 100755
index be188c0..0000000
--- a/contrib/stats/packinfo.pl
+++ /dev/null
@@ -1,212 +0,0 @@
-#!/usr/bin/perl
-#
-# This tool will print vaguely pretty information about a pack.  It
-# expects the output of "git verify-pack -v" as input on stdin.
-#
-# $ git verify-pack -v | packinfo.pl
-#
-# This prints some full-pack statistics; currently "all sizes", "all
-# path sizes", "tree sizes", "tree path sizes", and "depths".
-#
-# * "all sizes" stats are across every object size in the file;
-#   full sizes for base objects, and delta size for deltas.
-# * "all path sizes" stats are across all object's "path sizes".
-#   A path size is the sum of the size of the delta chain, including the
-#   base object.  In other words, it's how many bytes need be read to
-#   reassemble the file from deltas.
-# * "tree sizes" are object sizes grouped into delta trees.
-# * "tree path sizes" are path sizes grouped into delta trees.
-# * "depths" should be obvious.
-#
-# When run as:
-#
-# $ git verify-pack -v | packinfo.pl -tree
-#
-# the trees of objects are output along with the stats.  This looks
-# like:
-#
-#   0 commit 031321c6...      803      803
-#
-#   0   blob 03156f21...     1767     1767
-#   1    blob f52a9d7f...       10     1777
-#   2     blob a8cc5739...       51     1828
-#   3      blob 660e90b1...       15     1843
-#   4       blob 0cb8e3bb...       33     1876
-#   2     blob e48607f0...      311     2088
-#      size: count 6 total 2187 min 10 max 1767 mean 364.50 median 51 std_dev 635.85
-# path size: count 6 total 11179 min 1767 max 2088 mean 1863.17 median 1843 std_dev 107.26
-#
-# The first number after the sha1 is the object size, the second
-# number is the path size.  The statistics are across all objects in
-# the previous delta tree.  Obviously they are omitted for trees of
-# one object.
-#
-# When run as:
-#
-# $ git verify-pack -v | packinfo.pl -tree -filenames
-#
-# it adds filenames to the tree.  Getting this information is slow:
-#
-#   0   blob 03156f21...     1767     1767 Documentation/git-lost-found.txt @ tags/v1.2.0~142
-#   1    blob f52a9d7f...       10     1777 Documentation/git-lost-found.txt @ tags/v1.5.0-rc1~74
-#   2     blob a8cc5739...       51     1828 Documentation/git-lost+found.txt @ tags/v0.99.9h^0
-#   3      blob 660e90b1...       15     1843 Documentation/git-lost+found.txt @ master~3222^2~2
-#   4       blob 0cb8e3bb...       33     1876 Documentation/git-lost+found.txt @ master~3222^2~3
-#   2     blob e48607f0...      311     2088 Documentation/git-lost-found.txt @ tags/v1.5.2-rc3~4
-#      size: count 6 total 2187 min 10 max 1767 mean 364.50 median 51 std_dev 635.85
-# path size: count 6 total 11179 min 1767 max 2088 mean 1863.17 median 1843 std_dev 107.26
-#
-# When run as:
-#
-# $ git verify-pack -v | packinfo.pl -dump
-#
-# it prints out "sha1 size pathsize depth" for each sha1 in lexical
-# order.
-#
-# 000079a2eaef17b7eae70e1f0f635557ea67b644 30 472 7
-# 00013cafe6980411aa6fdd940784917b5ff50f0a 44 1542 4
-# 000182eacf99cde27d5916aa415921924b82972c 499 499 0
-# ...
-#
-# This is handy for comparing two packs.  Adding "-filenames" will add
-# filenames, as per "-tree -filenames" above.
-
-use strict;
-use Getopt::Long;
-
-my $filenames = 0;
-my $tree = 0;
-my $dump = 0;
-GetOptions("tree" => \$tree,
-           "filenames" => \$filenames,
-           "dump" => \$dump);
-
-my %parents;
-my %children;
-my %sizes;
-my @roots;
-my %paths;
-my %types;
-my @commits;
-my %names;
-my %depths;
-my @depths;
-
-while (<STDIN>) {
-    my ($sha1, $type, $size, $space, $offset, $depth, $parent) = split(/\s+/, $_);
-    next unless ($sha1 =~ /^[0-9a-f]{40}$/);
-    $depths{$sha1} = $depth || 0;
-    push(@depths, $depth || 0);
-    push(@commits, $sha1) if ($type eq 'commit');
-    push(@roots, $sha1) unless $parent;
-    $parents{$sha1} = $parent;
-    $types{$sha1} = $type;
-    push(@{$children{$parent}}, $sha1);
-    $sizes{$sha1} = $size;
-}
-
-if ($filenames && ($tree || $dump)) {
-    open(NAMES, "git name-rev --all|");
-    while (<NAMES>) {
-        if (/^(\S+)\s+(.*)$/) {
-            my ($sha1, $name) = ($1, $2);
-            $names{$sha1} = $name;
-        }
-    }
-    close NAMES;
-
-    for my $commit (@commits) {
-        my $name = $names{$commit};
-        open(TREE, "git ls-tree -t -r $commit|");
-        print STDERR "Plumbing tree $name\n";
-        while (<TREE>) {
-            if (/^(\S+)\s+(\S+)\s+(\S+)\s+(.*)$/) {
-                my ($mode, $type, $sha1, $path) = ($1, $2, $3, $4);
-                $paths{$sha1} = "$path @ $name";
-            }
-        }
-        close TREE;
-    }
-}
-
-sub stats {
-    my @data = sort {$a <=> $b} @_;
-    my $min = $data[0];
-    my $max = $data[$#data];
-    my $total = 0;
-    my $count = scalar @data;
-    for my $datum (@data) {
-        $total += $datum;
-    }
-    my $mean = $total / $count;
-    my $median = $data[int(@data / 2)];
-    my $diff_sum = 0;
-    for my $datum (@data) {
-        $diff_sum += ($datum - $mean)**2;
-    }
-    my $std_dev = sqrt($diff_sum / $count);
-    return ($count, $total, $min, $max, $mean, $median, $std_dev);
-}
-
-sub print_stats {
-    my $name = shift;
-    my ($count, $total, $min, $max, $mean, $median, $std_dev) = stats(@_);
-    printf("%s: count %s total %s min %s max %s mean %.2f median %s std_dev %.2f\n",
-           $name, $count, $total, $min, $max, $mean, $median, $std_dev);
-}
-
-my @sizes;
-my @path_sizes;
-my @all_sizes;
-my @all_path_sizes;
-my %path_sizes;
-
-sub dig {
-    my ($sha1, $depth, $path_size) = @_;
-    $path_size += $sizes{$sha1};
-    push(@sizes, $sizes{$sha1});
-    push(@all_sizes, $sizes{$sha1});
-    push(@path_sizes, $path_size);
-    push(@all_path_sizes, $path_size);
-    $path_sizes{$sha1} = $path_size;
-    if ($tree) {
-        printf("%3d%s %6s %s %8d %8d %s\n",
-               $depth, (" " x $depth), $types{$sha1},
-               $sha1, $sizes{$sha1}, $path_size, $paths{$sha1});
-    }
-    for my $child (@{$children{$sha1}}) {
-        dig($child, $depth + 1, $path_size);
-    }
-}
-
-my @tree_sizes;
-my @tree_path_sizes;
-
-for my $root (@roots) {
-    undef @sizes;
-    undef @path_sizes;
-    dig($root, 0, 0);
-    my ($aa, $sz_total) = stats(@sizes);
-    my ($bb, $psz_total) = stats(@path_sizes);
-    push(@tree_sizes, $sz_total);
-    push(@tree_path_sizes, $psz_total);
-    if ($tree) {
-        if (@sizes > 1) {
-            print_stats("     size", @sizes);
-            print_stats("path size", @path_sizes);
-        }
-        print "\n";
-    }
-}
-
-if ($dump) {
-    for my $sha1 (sort keys %sizes) {
-        print "$sha1 $sizes{$sha1} $path_sizes{$sha1} $depths{$sha1} $paths{$sha1}\n";
-    }
-} else {
-    print_stats("      all sizes", @all_sizes);
-    print_stats(" all path sizes", @all_path_sizes);
-    print_stats("     tree sizes", @tree_sizes);
-    print_stats("tree path sizes", @tree_path_sizes);
-    print_stats("         depths", @depths);
-}
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 02/25] contrib: remove 'hg-to-git' Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 03/25] contrib: remove 'stats' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  7:53   ` Erik Faye-Lund
  2014-05-09  0:58 ` [PATCH v1 05/25] contrib: remove 'convert-objects' Felipe Contreras
                   ` (22 subsequent siblings)
  25 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity since 2010, no documentation, no tests.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/buildsystems/Generators.pm        |  42 --
 contrib/buildsystems/Generators/QMake.pm  | 189 ---------
 contrib/buildsystems/Generators/Vcproj.pm | 626 ------------------------------
 contrib/buildsystems/engine.pl            | 359 -----------------
 contrib/buildsystems/generate             |  29 --
 contrib/buildsystems/parse.pl             | 228 -----------
 6 files changed, 1473 deletions(-)
 delete mode 100644 contrib/buildsystems/Generators.pm
 delete mode 100644 contrib/buildsystems/Generators/QMake.pm
 delete mode 100644 contrib/buildsystems/Generators/Vcproj.pm
 delete mode 100755 contrib/buildsystems/engine.pl
 delete mode 100755 contrib/buildsystems/generate
 delete mode 100755 contrib/buildsystems/parse.pl

diff --git a/contrib/buildsystems/Generators.pm b/contrib/buildsystems/Generators.pm
deleted file mode 100644
index 408ef71..0000000
--- a/contrib/buildsystems/Generators.pm
+++ /dev/null
@@ -1,42 +0,0 @@
-package Generators;
-require Exporter;
-
-use strict;
-use File::Basename;
-no strict 'refs';
-use vars qw($VERSION @AVAILABLE);
-
-our $VERSION = '1.00';
-our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
-@ISA = qw(Exporter);
-
-BEGIN {
-    local(*D);
-    my $me = $INC{"Generators.pm"};
-    die "Couldn't find myself in \@INC, which is required to load the generators!" if ("$me" eq "");
-    $me = dirname($me);
-    if (opendir(D,"$me/Generators")) {
-        foreach my $gen (readdir(D)) {
-            next if ($gen  =~ /^\.\.?$/);
-            require "${me}/Generators/$gen";
-            $gen =~ s,\.pm,,;
-            push(@AVAILABLE, $gen);
-        }
-        closedir(D);
-        my $gens = join(', ', @AVAILABLE);
-    }
-
-    push @EXPORT_OK, qw(available);
-}
-
-sub available {
-    return @AVAILABLE;
-}
-
-sub generate {
-    my ($gen, $git_dir, $out_dir, $rel_dir, %build_structure) = @_;
-    return eval("Generators::${gen}::generate(\$git_dir, \$out_dir, \$rel_dir, \%build_structure)") if grep(/^$gen$/, @AVAILABLE);
-    die "Generator \"${gen}\" is not available!\nAvailable generators are: @AVAILABLE\n";
-}
-
-1;
diff --git a/contrib/buildsystems/Generators/QMake.pm b/contrib/buildsystems/Generators/QMake.pm
deleted file mode 100644
index ff3b657..0000000
--- a/contrib/buildsystems/Generators/QMake.pm
+++ /dev/null
@@ -1,189 +0,0 @@
-package Generators::QMake;
-require Exporter;
-
-use strict;
-use vars qw($VERSION);
-
-our $VERSION = '1.00';
-our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
-@ISA = qw(Exporter);
-
-BEGIN {
-    push @EXPORT_OK, qw(generate);
-}
-
-sub generate {
-    my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
-
-    my @libs = @{$build_structure{"LIBS"}};
-    foreach (@libs) {
-        createLibProject($_, $git_dir, $out_dir, $rel_dir, %build_structure);
-    }
-
-    my @apps = @{$build_structure{"APPS"}};
-    foreach (@apps) {
-        createAppProject($_, $git_dir, $out_dir, $rel_dir, %build_structure);
-    }
-
-    createGlueProject($git_dir, $out_dir, $rel_dir, %build_structure);
-    return 0;
-}
-
-sub createLibProject {
-    my ($libname, $git_dir, $out_dir, $rel_dir, %build_structure) = @_;
-    print "Generate $libname lib project\n";
-    $rel_dir = "../$rel_dir";
-
-    my $sources = join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"LIBS_${libname}_SOURCES"}})));
-    my $defines = join(" \\\n\t", sort(@{$build_structure{"LIBS_${libname}_DEFINES"}}));
-    my $includes= join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"LIBS_${libname}_INCLUDES"}})));
-    my $cflags  = join(" ", sort(@{$build_structure{"LIBS_${libname}_CFLAGS"}}));
-
-    my $cflags_debug = $cflags;
-    $cflags_debug =~ s/-MT/-MTd/;
-    $cflags_debug =~ s/-O.//;
-
-    my $cflags_release = $cflags;
-    $cflags_release =~ s/-MTd/-MT/;
-
-    my @tmp  = @{$build_structure{"LIBS_${libname}_LFLAGS"}};
-    my @tmp2 = ();
-    foreach (@tmp) {
-        if (/^-LTCG/) {
-        } elsif (/^-L/) {
-            $_ =~ s/^-L/-LIBPATH:$rel_dir\//;
-        }
-        push(@tmp2, $_);
-    }
-    my $lflags = join(" ", sort(@tmp));
-
-    my $target = $libname;
-    $target =~ s/\//_/g;
-    $defines =~ s/-D//g;
-    $defines =~ s/"/\\\\"/g;
-    $includes =~ s/-I//g;
-    mkdir "$target" || die "Could not create the directory $target for lib project!\n";
-    open F, ">$target/$target.pro" || die "Could not open $target/$target.pro for writing!\n";
-    print F << "EOM";
-TEMPLATE = lib
-TARGET = $target
-DESTDIR = $rel_dir
-
-CONFIG -= qt
-CONFIG += static
-
-QMAKE_CFLAGS =
-QMAKE_CFLAGS_RELEASE = $cflags_release
-QMAKE_CFLAGS_DEBUG = $cflags_debug
-QMAKE_LIBFLAGS = $lflags
-
-DEFINES += \\
-        $defines
-
-INCLUDEPATH += \\
-        $includes
-
-SOURCES += \\
-        $sources
-EOM
-    close F;
-}
-
-sub createAppProject {
-    my ($appname, $git_dir, $out_dir, $rel_dir, %build_structure) = @_;
-    print "Generate $appname app project\n";
-    $rel_dir = "../$rel_dir";
-
-    my $sources = join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"APPS_${appname}_SOURCES"}})));
-    my $defines = join(" \\\n\t", sort(@{$build_structure{"APPS_${appname}_DEFINES"}}));
-    my $includes= join(" \\\n\t", sort(map("$rel_dir/$_", @{$build_structure{"APPS_${appname}_INCLUDES"}})));
-    my $cflags  = join(" ", sort(@{$build_structure{"APPS_${appname}_CFLAGS"}}));
-
-    my $cflags_debug = $cflags;
-    $cflags_debug =~ s/-MT/-MTd/;
-    $cflags_debug =~ s/-O.//;
-
-    my $cflags_release = $cflags;
-    $cflags_release =~ s/-MTd/-MT/;
-
-    my $libs;
-    foreach (sort(@{$build_structure{"APPS_${appname}_LIBS"}})) {
-        $_ =~ s/\//_/g;
-        $libs .= " $_";
-    }
-    my @tmp  = @{$build_structure{"APPS_${appname}_LFLAGS"}};
-    my @tmp2 = ();
-    foreach (@tmp) {
-        # next if ($_ eq "-NODEFAULTLIB:MSVCRT.lib");
-        if (/^-LTCG/) {
-        } elsif (/^-L/) {
-            $_ =~ s/^-L/-LIBPATH:$rel_dir\//;
-        }
-        push(@tmp2, $_);
-    }
-    my $lflags = join(" ", sort(@tmp));
-
-    my $target = $appname;
-    $target =~ s/\.exe//;
-    $target =~ s/\//_/g;
-    $defines =~ s/-D//g;
-    $defines =~ s/"/\\\\"/g;
-    $includes =~ s/-I//g;
-    mkdir "$target" || die "Could not create the directory $target for app project!\n";
-    open F, ">$target/$target.pro" || die "Could not open $target/$target.pro for writing!\n";
-    print F << "EOM";
-TEMPLATE = app
-TARGET = $target
-DESTDIR = $rel_dir
-
-CONFIG -= qt embed_manifest_exe
-CONFIG += console
-
-QMAKE_CFLAGS =
-QMAKE_CFLAGS_RELEASE = $cflags_release
-QMAKE_CFLAGS_DEBUG = $cflags_debug
-QMAKE_LFLAGS = $lflags
-LIBS   = $libs
-
-DEFINES += \\
-        $defines
-
-INCLUDEPATH += \\
-        $includes
-
-win32:QMAKE_LFLAGS += -LIBPATH:$rel_dir
-else: QMAKE_LFLAGS += -L$rel_dir
-
-SOURCES += \\
-        $sources
-EOM
-    close F;
-}
-
-sub createGlueProject {
-    my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
-    my $libs = join(" \\ \n", map("\t$_|$_.pro", @{$build_structure{"LIBS"}}));
-    my $apps = join(" \\ \n", map("\t$_|$_.pro", @{$build_structure{"APPS"}}));
-    $libs =~ s/\.a//g;
-    $libs =~ s/\//_/g;
-    $libs =~ s/\|/\//g;
-    $apps =~ s/\.exe//g;
-    $apps =~ s/\//_/g;
-    $apps =~ s/\|/\//g;
-
-    my $filename = $out_dir;
-    $filename =~ s/.*\/([^\/]+)$/$1/;
-    $filename =~ s/\/$//;
-    print "Generate glue project $filename.pro\n";
-    open F, ">$filename.pro" || die "Could not open $filename.pro for writing!\n";
-    print F << "EOM";
-TEMPLATE = subdirs
-CONFIG += ordered
-SUBDIRS += \\
-$libs \\
-$apps
-EOM
-    close F;
-}
-
-1;
diff --git a/contrib/buildsystems/Generators/Vcproj.pm b/contrib/buildsystems/Generators/Vcproj.pm
deleted file mode 100644
index cfa74ad..0000000
--- a/contrib/buildsystems/Generators/Vcproj.pm
+++ /dev/null
@@ -1,626 +0,0 @@
-package Generators::Vcproj;
-require Exporter;
-
-use strict;
-use vars qw($VERSION);
-
-our $VERSION = '1.00';
-our(@ISA, @EXPORT, @EXPORT_OK, @AVAILABLE);
-@ISA = qw(Exporter);
-
-BEGIN {
-    push @EXPORT_OK, qw(generate);
-}
-
-my $guid_index = 0;
-my @GUIDS = (
-    "{E07B9989-2BF7-4F21-8918-BE22BA467AC3}",
-    "{278FFB51-0296-4A44-A81A-22B87B7C3592}",
-    "{7346A2C4-F0FD-444F-9EBE-1AF23B2B5650}",
-    "{67F421AC-EB34-4D49-820B-3196807B423F}",
-    "{385DCFE1-CC8C-4211-A451-80FCFC31CA51}",
-    "{97CC46C5-D2CC-4D26-B634-E75792B79916}",
-    "{C7CE21FE-6EF8-4012-A5C7-A22BCEDFBA11}",
-    "{51575134-3FDF-42D1-BABD-3FB12669C6C9}",
-    "{0AE195E4-9823-4B87-8E6F-20C5614AF2FF}",
-    "{4B918255-67CA-43BB-A46C-26704B666E6B}",
-    "{18CCFEEF-C8EE-4CC1-A265-26F95C9F4649}",
-    "{5D5D90FA-01B7-4973-AFE5-CA88C53AC197}",
-    "{1F054320-036D-49E1-B384-FB5DF0BC8AC0}",
-    "{7CED65EE-F2D9-4171-825B-C7D561FE5786}",
-    "{8D341679-0F07-4664-9A56-3BA0DE88B9BC}",
-    "{C189FEDC-2957-4BD7-9FA4-7622241EA145}",
-    "{66844203-1B9F-4C53-9274-164FFF95B847}",
-    "{E4FEA145-DECC-440D-AEEA-598CF381FD43}",
-    "{73300A8E-C8AC-41B0-B555-4F596B681BA7}",
-    "{873FDEB1-D01D-40BF-A1BF-8BBC58EC0F51}",
-    "{7922C8BE-76C5-4AC6-8BF7-885C0F93B782}",
-    "{E245D370-308B-4A49-BFC1-1E527827975F}",
-    "{F6FA957B-66FC-4ED7-B260-E59BBE4FE813}",
-    "{E6055070-0198-431A-BC49-8DB6CEE770AE}",
-    "{54159234-C3EB-43DA-906B-CE5DA5C74654}",
-    "{594CFC35-0B60-46F6-B8EF-9983ACC1187D}",
-    "{D93FCAB7-1F01-48D2-B832-F761B83231A5}",
-    "{DBA5E6AC-E7BE-42D3-8703-4E787141526E}",
-    "{6171953F-DD26-44C7-A3BE-CC45F86FC11F}",
-    "{9E19DDBE-F5E4-4A26-A2FE-0616E04879B8}",
-    "{AE81A615-99E3-4885-9CE0-D9CAA193E867}",
-    "{FBF4067E-1855-4F6C-8BCD-4D62E801A04D}",
-    "{17007948-6593-4AEB-8106-F7884B4F2C19}",
-    "{199D4C8D-8639-4DA6-82EF-08668C35DEE0}",
-    "{E085E50E-C140-4CF3-BE4B-094B14F0DDD6}",
-    "{00785268-A9CC-4E40-AC29-BAC0019159CE}",
-    "{4C06F56A-DCDB-46A6-B67C-02339935CF12}",
-    "{3A62D3FD-519E-4EC9-8171-D2C1BFEA022F}",
-    "{3A62D3FD-519E-4EC9-8171-D2C1BFEA022F}",
-    "{9392EB58-D7BA-410B-B1F0-B2FAA6BC89A7}",
-    "{2ACAB2D5-E0CE-4027-BCA0-D78B2D7A6C66}",
-    "{86E216C3-43CE-481A-BCB2-BE5E62850635}",
-    "{FB631291-7923-4B91-9A57-7B18FDBB7A42}",
-    "{0A176EC9-E934-45B8-B87F-16C7F4C80039}",
-    "{DF55CA80-46E8-4C53-B65B-4990A23DD444}",
-    "{3A0F9895-55D2-4710-BE5E-AD7498B5BF44}",
-    "{294BDC5A-F448-48B6-8110-DD0A81820F8C}",
-    "{4B9F66E9-FAC9-47AB-B1EF-C16756FBFD06}",
-    "{72EA49C6-2806-48BD-B81B-D4905102E19C}",
-    "{5728EB7E-8929-486C-8CD5-3238D060E768}"
-);
-
-sub generate {
-    my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
-    my @libs = @{$build_structure{"LIBS"}};
-    foreach (@libs) {
-        createLibProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure);
-    }
-
-    my @apps = @{$build_structure{"APPS"}};
-    foreach (@apps) {
-        createAppProject($_, $git_dir, $out_dir, $rel_dir, \%build_structure);
-    }
-
-    createGlueProject($git_dir, $out_dir, $rel_dir, %build_structure);
-    return 0;
-}
-
-sub createLibProject {
-    my ($libname, $git_dir, $out_dir, $rel_dir, $build_structure) = @_;
-    print "Generate $libname vcproj lib project\n";
-    $rel_dir = "..\\$rel_dir";
-    $rel_dir =~ s/\//\\/g;
-
-    my $target = $libname;
-    $target =~ s/\//_/g;
-    $target =~ s/\.a//;
-
-    my $uuid = $GUIDS[$guid_index];
-    $$build_structure{"LIBS_${target}_GUID"} = $uuid;
-    $guid_index += 1;
-
-    my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"LIBS_${libname}_SOURCES"}}));
-    my @sources;
-    foreach (@srcs) {
-        $_ =~ s/\//\\/g;
-        push(@sources, $_);
-    }
-    my $defines = join(",", sort(@{$$build_structure{"LIBS_${libname}_DEFINES"}}));
-    my $includes= join(";", sort(map("&quot;$rel_dir\\$_&quot;", @{$$build_structure{"LIBS_${libname}_INCLUDES"}})));
-    my $cflags  = join(" ", sort(@{$$build_structure{"LIBS_${libname}_CFLAGS"}}));
-    $cflags =~ s/\"/&quot;/g;
-
-    my $cflags_debug = $cflags;
-    $cflags_debug =~ s/-MT/-MTd/;
-    $cflags_debug =~ s/-O.//;
-
-    my $cflags_release = $cflags;
-    $cflags_release =~ s/-MTd/-MT/;
-
-    my @tmp  = @{$$build_structure{"LIBS_${libname}_LFLAGS"}};
-    my @tmp2 = ();
-    foreach (@tmp) {
-        if (/^-LTCG/) {
-        } elsif (/^-L/) {
-            $_ =~ s/^-L/-LIBPATH:$rel_dir\//;
-        }
-        push(@tmp2, $_);
-    }
-    my $lflags = join(" ", sort(@tmp));
-
-    $defines =~ s/-D//g;
-    $defines =~ s/\"/\\&quot;/g;
-    $defines =~ s/\'//g;
-    $includes =~ s/-I//g;
-    mkdir "$target" || die "Could not create the directory $target for lib project!\n";
-    open F, ">$target/$target.vcproj" || die "Could not open $target/$target.pro for writing!\n";
-    binmode F, ":crlf";
-    print F << "EOM";
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9,00"
-	Name="$target"
-	ProjectGUID="$uuid">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$rel_dir"
-			ConfigurationType="4"
-			CharacterSet="0"
-			IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalOptions="$cflags_debug"
-				Optimization="0"
-				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="$includes"
-				PreprocessorDefinitions="WIN32,_DEBUG,$defines"
-				MinimalRebuild="true"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				ProgramDataBaseFileName="\$(IntDir)\\\$(TargetName).pdb"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLibrarianTool"
-				SuppressStartupBanner="true"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$rel_dir"
-			ConfigurationType="4"
-			CharacterSet="0"
-			WholeProgramOptimization="1"
-			IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalOptions="$cflags_release"
-				Optimization="2"
-				InlineFunctionExpansion="1"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="$includes"
-				PreprocessorDefinitions="WIN32,NDEBUG,$defines"
-				RuntimeLibrary="0"
-				EnableFunctionLevelLinking="true"
-				UsePrecompiledHeader="0"
-				ProgramDataBaseFileName="\$(IntDir)\\\$(TargetName).pdb"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLibrarianTool"
-				SuppressStartupBanner="true"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
-EOM
-    foreach(@sources) {
-        print F << "EOM";
-			<File
-				RelativePath="$_"/>
-EOM
-    }
-    print F << "EOM";
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
-EOM
-    close F;
-}
-
-sub createAppProject {
-    my ($appname, $git_dir, $out_dir, $rel_dir, $build_structure) = @_;
-    print "Generate $appname vcproj app project\n";
-    $rel_dir = "..\\$rel_dir";
-    $rel_dir =~ s/\//\\/g;
-
-    my $target = $appname;
-    $target =~ s/\//_/g;
-    $target =~ s/\.exe//;
-
-    my $uuid = $GUIDS[$guid_index];
-    $$build_structure{"APPS_${target}_GUID"} = $uuid;
-    $guid_index += 1;
-
-    my @srcs = sort(map("$rel_dir\\$_", @{$$build_structure{"APPS_${appname}_SOURCES"}}));
-    my @sources;
-    foreach (@srcs) {
-        $_ =~ s/\//\\/g;
-        push(@sources, $_);
-    }
-    my $defines = join(",", sort(@{$$build_structure{"APPS_${appname}_DEFINES"}}));
-    my $includes= join(";", sort(map("&quot;$rel_dir\\$_&quot;", @{$$build_structure{"APPS_${appname}_INCLUDES"}})));
-    my $cflags  = join(" ", sort(@{$$build_structure{"APPS_${appname}_CFLAGS"}}));
-    $cflags =~ s/\"/&quot;/g;
-
-    my $cflags_debug = $cflags;
-    $cflags_debug =~ s/-MT/-MTd/;
-    $cflags_debug =~ s/-O.//;
-
-    my $cflags_release = $cflags;
-    $cflags_release =~ s/-MTd/-MT/;
-
-    my $libs;
-    foreach (sort(@{$$build_structure{"APPS_${appname}_LIBS"}})) {
-        $_ =~ s/\//_/g;
-        $libs .= " $_";
-    }
-    my @tmp  = @{$$build_structure{"APPS_${appname}_LFLAGS"}};
-    my @tmp2 = ();
-    foreach (@tmp) {
-        if (/^-LTCG/) {
-        } elsif (/^-L/) {
-            $_ =~ s/^-L/-LIBPATH:$rel_dir\//;
-        }
-        push(@tmp2, $_);
-    }
-    my $lflags = join(" ", sort(@tmp)) . " -LIBPATH:$rel_dir";
-
-    $defines =~ s/-D//g;
-    $defines =~ s/\"/\\&quot;/g;
-    $defines =~ s/\'//g;
-    $defines =~ s/\\\\/\\/g;
-    $includes =~ s/-I//g;
-    mkdir "$target" || die "Could not create the directory $target for lib project!\n";
-    open F, ">$target/$target.vcproj" || die "Could not open $target/$target.pro for writing!\n";
-    binmode F, ":crlf";
-    print F << "EOM";
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9,00"
-	Name="$target"
-	ProjectGUID="$uuid">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$rel_dir"
-			ConfigurationType="1"
-			CharacterSet="0"
-			IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalOptions="$cflags_debug"
-				Optimization="0"
-				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="$includes"
-				PreprocessorDefinitions="WIN32,_DEBUG,$defines"
-				MinimalRebuild="true"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				ProgramDataBaseFileName="\$(IntDir)\\\$(TargetName).pdb"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="$libs"
-				AdditionalOptions="$lflags"
-				LinkIncremental="2"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$rel_dir"
-			ConfigurationType="1"
-			CharacterSet="0"
-			WholeProgramOptimization="1"
-			IntermediateDirectory="\$(ProjectDir)\$(ConfigurationName)"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalOptions="$cflags_release"
-				Optimization="2"
-				InlineFunctionExpansion="1"
-				EnableIntrinsicFunctions="true"
-				AdditionalIncludeDirectories="$includes"
-				PreprocessorDefinitions="WIN32,NDEBUG,$defines"
-				RuntimeLibrary="0"
-				EnableFunctionLevelLinking="true"
-				UsePrecompiledHeader="0"
-				ProgramDataBaseFileName="\$(IntDir)\\\$(TargetName).pdb"
-				WarningLevel="3"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="$libs"
-				AdditionalOptions="$lflags"
-				LinkIncremental="1"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				TargetMachine="1"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
-EOM
-    foreach(@sources) {
-        print F << "EOM";
-			<File
-				RelativePath="$_"/>
-EOM
-    }
-    print F << "EOM";
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
-EOM
-    close F;
-}
-
-sub createGlueProject {
-    my ($git_dir, $out_dir, $rel_dir, %build_structure) = @_;
-    print "Generate solutions file\n";
-    $rel_dir = "..\\$rel_dir";
-    $rel_dir =~ s/\//\\/g;
-    my $SLN_HEAD = "Microsoft Visual Studio Solution File, Format Version 10.00\n# Visual Studio 2008\n";
-    my $SLN_PRE  = "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = ";
-    my $SLN_POST = "\nEndProject\n";
-
-    my @libs = @{$build_structure{"LIBS"}};
-    my @tmp;
-    foreach (@libs) {
-        $_ =~ s/\//_/g;
-        $_ =~ s/\.a//;
-        push(@tmp, $_);
-    }
-    @libs = @tmp;
-
-    my @apps = @{$build_structure{"APPS"}};
-    @tmp = ();
-    foreach (@apps) {
-        $_ =~ s/\//_/g;
-        $_ =~ s/\.exe//;
-        push(@tmp, $_);
-    }
-    @apps = @tmp;
-
-    open F, ">git.sln" || die "Could not open git.sln for writing!\n";
-    binmode F, ":crlf";
-    print F "$SLN_HEAD";
-    foreach (@libs) {
-        my $libname = $_;
-        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
-        print F "$SLN_PRE";
-        print F "\"${libname}\", \"${libname}\\${libname}.vcproj\", \"${uuid}\"";
-        print F "$SLN_POST";
-    }
-    my $uuid_libgit = $build_structure{"LIBS_libgit_GUID"};
-    my $uuid_xdiff_lib = $build_structure{"LIBS_xdiff_lib_GUID"};
-    foreach (@apps) {
-        my $appname = $_;
-        my $uuid = $build_structure{"APPS_${appname}_GUID"};
-        print F "$SLN_PRE";
-        print F "\"${appname}\", \"${appname}\\${appname}.vcproj\", \"${uuid}\"\n";
-        print F "	ProjectSection(ProjectDependencies) = postProject\n";
-        print F "		${uuid_libgit} = ${uuid_libgit}\n";
-        print F "		${uuid_xdiff_lib} = ${uuid_xdiff_lib}\n";
-        print F "	EndProjectSection";
-        print F "$SLN_POST";
-    }
-
-    print F << "EOM";
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-EOM
-    print F << "EOM";
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-EOM
-    foreach (@libs) {
-        my $libname = $_;
-        my $uuid = $build_structure{"LIBS_${libname}_GUID"};
-        print F "\t\t${uuid}.Debug|Win32.ActiveCfg = Debug|Win32\n";
-        print F "\t\t${uuid}.Debug|Win32.Build.0 = Debug|Win32\n";
-        print F "\t\t${uuid}.Release|Win32.ActiveCfg = Release|Win32\n";
-        print F "\t\t${uuid}.Release|Win32.Build.0 = Release|Win32\n";
-    }
-    foreach (@apps) {
-        my $appname = $_;
-        my $uuid = $build_structure{"APPS_${appname}_GUID"};
-        print F "\t\t${uuid}.Debug|Win32.ActiveCfg = Debug|Win32\n";
-        print F "\t\t${uuid}.Debug|Win32.Build.0 = Debug|Win32\n";
-        print F "\t\t${uuid}.Release|Win32.ActiveCfg = Release|Win32\n";
-        print F "\t\t${uuid}.Release|Win32.Build.0 = Release|Win32\n";
-    }
-
-    print F << "EOM";
-	EndGlobalSection
-EndGlobal
-EOM
-    close F;
-}
-
-1;
diff --git a/contrib/buildsystems/engine.pl b/contrib/buildsystems/engine.pl
deleted file mode 100755
index 23da787..0000000
--- a/contrib/buildsystems/engine.pl
+++ /dev/null
@@ -1,359 +0,0 @@
-#!/usr/bin/perl -w
-######################################################################
-# Do not call this script directly!
-#
-# The generate script ensures that @INC is correct before the engine
-# is executed.
-#
-# Copyright (C) 2009 Marius Storm-Olsen <mstormo@gmail.com>
-######################################################################
-use strict;
-use File::Basename;
-use File::Spec;
-use Cwd;
-use Generators;
-
-my (%build_structure, %compile_options, @makedry);
-my $out_dir = getcwd();
-my $git_dir = $out_dir;
-$git_dir =~ s=\\=/=g;
-$git_dir = dirname($git_dir) while (!-e "$git_dir/git.c" && "$git_dir" ne "");
-die "Couldn't find Git repo" if ("$git_dir" eq "");
-
-my @gens = Generators::available();
-my $gen = "Vcproj";
-
-sub showUsage
-{
-    my $genlist = join(', ', @gens);
-    print << "EOM";
-generate usage:
-  -g <GENERATOR>  --gen <GENERATOR> Specify the buildsystem generator    (default: $gen)
-                                    Available: $genlist
-  -o <PATH>       --out <PATH>      Specify output directory generation  (default: .)
-  -i <FILE>       --in <FILE>       Specify input file, instead of running GNU Make
-  -h,-?           --help            This help
-EOM
-    exit 0;
-}
-
-# Parse command-line options
-while (@ARGV) {
-    my $arg = shift @ARGV;
-    if ("$arg" eq "-h" || "$arg" eq "--help" || "$arg" eq "-?") {
-	showUsage();
-	exit(0);
-    } elsif("$arg" eq "--out" || "$arg" eq "-o") {
-	$out_dir = shift @ARGV;
-    } elsif("$arg" eq "--gen" || "$arg" eq "-g") {
-	$gen = shift @ARGV;
-    } elsif("$arg" eq "--in" || "$arg" eq "-i") {
-	my $infile = shift @ARGV;
-        open(F, "<$infile") || die "Couldn't open file $infile";
-        @makedry = <F>;
-        close(F);
-    }
-}
-
-# NOT using File::Spec->rel2abs($path, $base) here, as
-# it fails badly for me in the msysgit environment
-$git_dir = File::Spec->rel2abs($git_dir);
-$out_dir = File::Spec->rel2abs($out_dir);
-my $rel_dir = makeOutRel2Git($git_dir, $out_dir);
-
-# Print some information so the user feels informed
-print << "EOM";
------
-Generator: $gen
-Git dir:   $git_dir
-Out dir:   $out_dir
------
-Running GNU Make to figure out build structure...
-EOM
-
-# Pipe a make --dry-run into a variable, if not already loaded from file
-@makedry = `cd $git_dir && make -n MSVC=1 V=1 2>/dev/null` if !@makedry;
-
-# Parse the make output into usable info
-parseMakeOutput();
-
-# Finally, ask the generator to start generating..
-Generators::generate($gen, $git_dir, $out_dir, $rel_dir, %build_structure);
-
-# main flow ends here
-# -------------------------------------------------------------------------------------------------
-
-
-# 1) path: /foo/bar/baz        2) path: /foo/bar/baz   3) path: /foo/bar/baz
-#    base: /foo/bar/baz/temp      base: /foo/bar          base: /tmp
-#    rel:  ..                     rel:  baz               rel:  ../foo/bar/baz
-sub makeOutRel2Git
-{
-    my ($path, $base) = @_;
-    my $rel;
-    if ("$path" eq "$base") {
-        return ".";
-    } elsif ($base =~ /^$path/) {
-        # case 1
-        my $tmp = $base;
-        $tmp =~ s/^$path//;
-        foreach (split('/', $tmp)) {
-            $rel .= "../" if ("$_" ne "");
-        }
-    } elsif ($path =~ /^$base/) {
-        # case 2
-        $rel = $path;
-        $rel =~ s/^$base//;
-        $rel = "./$rel";
-    } else {
-        my $tmp = $base;
-        foreach (split('/', $tmp)) {
-            $rel .= "../" if ("$_" ne "");
-        }
-        $rel .= $path;
-    }
-    $rel =~ s/\/\//\//g; # simplify
-    $rel =~ s/\/$//;     # don't end with /
-    return $rel;
-}
-
-sub parseMakeOutput
-{
-    print "Parsing GNU Make output to figure out build structure...\n";
-    my $line = 0;
-    while (my $text = shift @makedry) {
-        my $ate_next;
-        do {
-            $ate_next = 0;
-            $line++;
-            chomp $text;
-            chop $text if ($text =~ /\r$/);
-            if ($text =~ /\\$/) {
-                $text =~ s/\\$//;
-                $text .= shift @makedry;
-                $ate_next = 1;
-            }
-        } while($ate_next);
-
-        if ($text =~ /^test /) {
-            # options to test (eg -o) may be mistaken for linker options
-            next;
-        }
-
-        if($text =~ / -c /) {
-            # compilation
-            handleCompileLine($text, $line);
-
-        } elsif ($text =~ / -o /) {
-            # linking executable
-            handleLinkLine($text, $line);
-
-        } elsif ($text =~ /\.o / && $text =~ /\.a /) {
-            # libifying
-            handleLibLine($text, $line);
-#
-#        } elsif ($text =~ /^cp /) {
-#            # copy file around
-#
-#        } elsif ($text =~ /^rm -f /) {
-#            # shell command
-#
-#        } elsif ($text =~ /^make[ \[]/) {
-#            # make output
-#
-#        } elsif ($text =~ /^echo /) {
-#            # echo to file
-#
-#        } elsif ($text =~ /^if /) {
-#            # shell conditional
-#
-#        } elsif ($text =~ /^tclsh /) {
-#            # translation stuff
-#
-#        } elsif ($text =~ /^umask /) {
-#            # handling boilerplates
-#
-#        } elsif ($text =~ /\$\(\:\)/) {
-#            # ignore
-#
-#        } elsif ($text =~ /^FLAGS=/) {
-#            # flags check for dependencies
-#
-#        } elsif ($text =~ /^'\/usr\/bin\/perl' -MError -e/) {
-#            # perl commands for copying files
-#
-#        } elsif ($text =~ /generate-cmdlist\.sh/) {
-#            # command for generating list of commands
-#
-#        } elsif ($text =~ /new locations or Tcl/) {
-#            # command for detecting Tcl/Tk changes
-#
-#        } elsif ($text =~ /mkdir -p/) {
-#            # command creating path
-#
-#        } elsif ($text =~ /: no custom templates yet/) {
-#            # whatever
-#
-#        } else {
-#            print "Unhandled (line: $line): $text\n";
-        }
-    }
-
-#    use Data::Dumper;
-#    print "Parsed build structure:\n";
-#    print Dumper(%build_structure);
-}
-
-# variables for the compilation part of each step
-my (@defines, @incpaths, @cflags, @sources);
-
-sub clearCompileStep
-{
-    @defines = ();
-    @incpaths = ();
-    @cflags = ();
-    @sources = ();
-}
-
-sub removeDuplicates
-{
-    my (%dupHash, $entry);
-    %dupHash = map { $_, 1 } @defines;
-    @defines = keys %dupHash;
-
-    %dupHash = map { $_, 1 } @incpaths;
-    @incpaths = keys %dupHash;
-
-    %dupHash = map { $_, 1 } @cflags;
-    @cflags = keys %dupHash;
-}
-
-sub handleCompileLine
-{
-    my ($line, $lineno) = @_;
-    my @parts = split(' ', $line);
-    my $sourcefile;
-    shift(@parts); # ignore cmd
-    while (my $part = shift @parts) {
-        if ("$part" eq "-o") {
-            # ignore object file
-            shift @parts;
-        } elsif ("$part" eq "-c") {
-            # ignore compile flag
-        } elsif ("$part" eq "-c") {
-        } elsif ($part =~ /^.?-I/) {
-            push(@incpaths, $part);
-        } elsif ($part =~ /^.?-D/) {
-            push(@defines, $part);
-        } elsif ($part =~ /^-/) {
-            push(@cflags, $part);
-        } elsif ($part =~ /\.(c|cc|cpp)$/) {
-            $sourcefile = $part;
-        } else {
-            die "Unhandled compiler option @ line $lineno: $part";
-        }
-    }
-    @{$compile_options{"${sourcefile}_CFLAGS"}} = @cflags;
-    @{$compile_options{"${sourcefile}_DEFINES"}} = @defines;
-    @{$compile_options{"${sourcefile}_INCPATHS"}} = @incpaths;
-    clearCompileStep();
-}
-
-sub handleLibLine
-{
-    my ($line, $lineno) = @_;
-    my (@objfiles, @lflags, $libout, $part);
-    # kill cmd and rm 'prefix'
-    $line =~ s/^rm -f .* && .* rcs //;
-    my @parts = split(' ', $line);
-    while ($part = shift @parts) {
-        if ($part =~ /^-/) {
-            push(@lflags, $part);
-        } elsif ($part =~ /\.(o|obj)$/) {
-            push(@objfiles, $part);
-        } elsif ($part =~ /\.(a|lib)$/) {
-            $libout = $part;
-            $libout =~ s/\.a$//;
-        } else {
-            die "Unhandled lib option @ line $lineno: $part";
-        }
-    }
-#    print "LibOut: '$libout'\nLFlags: @lflags\nOfiles: @objfiles\n";
-#    exit(1);
-    foreach (@objfiles) {
-        my $sourcefile = $_;
-        $sourcefile =~ s/\.o/.c/;
-        push(@sources, $sourcefile);
-        push(@cflags, @{$compile_options{"${sourcefile}_CFLAGS"}});
-        push(@defines, @{$compile_options{"${sourcefile}_DEFINES"}});
-        push(@incpaths, @{$compile_options{"${sourcefile}_INCPATHS"}});
-    }
-    removeDuplicates();
-
-    push(@{$build_structure{"LIBS"}}, $libout);
-    @{$build_structure{"LIBS_${libout}"}} = ("_DEFINES", "_INCLUDES", "_CFLAGS", "_SOURCES",
-                                             "_OBJECTS");
-    @{$build_structure{"LIBS_${libout}_DEFINES"}} = @defines;
-    @{$build_structure{"LIBS_${libout}_INCLUDES"}} = @incpaths;
-    @{$build_structure{"LIBS_${libout}_CFLAGS"}} = @cflags;
-    @{$build_structure{"LIBS_${libout}_LFLAGS"}} = @lflags;
-    @{$build_structure{"LIBS_${libout}_SOURCES"}} = @sources;
-    @{$build_structure{"LIBS_${libout}_OBJECTS"}} = @objfiles;
-    clearCompileStep();
-}
-
-sub handleLinkLine
-{
-    my ($line, $lineno) = @_;
-    my (@objfiles, @lflags, @libs, $appout, $part);
-    my @parts = split(' ', $line);
-    shift(@parts); # ignore cmd
-    while ($part = shift @parts) {
-        if ($part =~ /^-IGNORE/) {
-            push(@lflags, $part);
-        } elsif ($part =~ /^-[GRIMDO]/) {
-            # eat compiler flags
-        } elsif ("$part" eq "-o") {
-            $appout = shift @parts;
-        } elsif ("$part" eq "-lz") {
-            push(@libs, "zlib.lib");
-	} elsif ("$part" eq "-lcrypto") {
-            push(@libs, "libeay32.lib");
-        } elsif ("$part" eq "-lssl") {
-            push(@libs, "ssleay32.lib");
-        } elsif ($part =~ /^-/) {
-            push(@lflags, $part);
-        } elsif ($part =~ /\.(a|lib)$/) {
-            $part =~ s/\.a$/.lib/;
-            push(@libs, $part);
-        } elsif ($part =~ /\.(o|obj)$/) {
-            push(@objfiles, $part);
-        } else {
-            die "Unhandled lib option @ line $lineno: $part";
-        }
-    }
-#    print "AppOut: '$appout'\nLFlags: @lflags\nLibs  : @libs\nOfiles: @objfiles\n";
-#    exit(1);
-    foreach (@objfiles) {
-        my $sourcefile = $_;
-        $sourcefile =~ s/\.o/.c/;
-        push(@sources, $sourcefile);
-        push(@cflags, @{$compile_options{"${sourcefile}_CFLAGS"}});
-        push(@defines, @{$compile_options{"${sourcefile}_DEFINES"}});
-        push(@incpaths, @{$compile_options{"${sourcefile}_INCPATHS"}});
-    }
-    removeDuplicates();
-
-    removeDuplicates();
-    push(@{$build_structure{"APPS"}}, $appout);
-    @{$build_structure{"APPS_${appout}"}} = ("_DEFINES", "_INCLUDES", "_CFLAGS", "_LFLAGS",
-                                             "_SOURCES", "_OBJECTS", "_LIBS");
-    @{$build_structure{"APPS_${appout}_DEFINES"}} = @defines;
-    @{$build_structure{"APPS_${appout}_INCLUDES"}} = @incpaths;
-    @{$build_structure{"APPS_${appout}_CFLAGS"}} = @cflags;
-    @{$build_structure{"APPS_${appout}_LFLAGS"}} = @lflags;
-    @{$build_structure{"APPS_${appout}_SOURCES"}} = @sources;
-    @{$build_structure{"APPS_${appout}_OBJECTS"}} = @objfiles;
-    @{$build_structure{"APPS_${appout}_LIBS"}} = @libs;
-    clearCompileStep();
-}
diff --git a/contrib/buildsystems/generate b/contrib/buildsystems/generate
deleted file mode 100755
index bc10f25..0000000
--- a/contrib/buildsystems/generate
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/perl -w
-######################################################################
-# Generate buildsystem files
-#
-# This script generate buildsystem files based on the output of a
-# GNU Make --dry-run, enabling Windows users to develop Git with their
-# trusted IDE with native projects.
-#
-# Note:
-# It is not meant as *the* way of building Git with MSVC, but merely a
-# convenience. The correct way of building Git with MSVC is to use the
-# GNU Make tool to build with the maintained Makefile in the root of
-# the project. If you have the msysgit environment installed and
-# available in your current console, together with the Visual Studio
-# environment you wish to build for, all you have to do is run the
-# command:
-#     make MSVC=1
-#
-# Copyright (C) 2009 Marius Storm-Olsen <mstormo@gmail.com>
-######################################################################
-use strict;
-use File::Basename;
-use Cwd;
-
-my $git_dir = getcwd();
-$git_dir =~ s=\\=/=g;
-$git_dir = dirname($git_dir) while (!-e "$git_dir/git.c" && "$git_dir" ne "");
-die "Couldn't find Git repo" if ("$git_dir" eq "");
-exec join(" ", ("PERL5LIB=${git_dir}/contrib/buildsystems ${git_dir}/contrib/buildsystems/engine.pl", @ARGV));
diff --git a/contrib/buildsystems/parse.pl b/contrib/buildsystems/parse.pl
deleted file mode 100755
index c9656ec..0000000
--- a/contrib/buildsystems/parse.pl
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/usr/bin/perl -w
-######################################################################
-# Do not call this script directly!
-#
-# The generate script ensures that @INC is correct before the engine
-# is executed.
-#
-# Copyright (C) 2009 Marius Storm-Olsen <mstormo@gmail.com>
-######################################################################
-use strict;
-use File::Basename;
-use Cwd;
-
-my $file = $ARGV[0];
-die "No file provided!" if !defined $file;
-
-my ($cflags, $target, $type, $line);
-
-open(F, "<$file") || die "Couldn't open file $file";
-my @data = <F>;
-close(F);
-
-while (my $text = shift @data) {
-    my $ate_next;
-    do {
-        $ate_next = 0;
-        $line++;
-        chomp $text;
-        chop $text if ($text =~ /\r$/);
-        if ($text =~ /\\$/) {
-            $text =~ s/\\$//;
-            $text .= shift @data;
-            $ate_next = 1;
-        }
-    } while($ate_next);
-
-    if($text =~ / -c /) {
-        # compilation
-        handleCompileLine($text, $line);
-
-    } elsif ($text =~ / -o /) {
-        # linking executable
-        handleLinkLine($text, $line);
-
-    } elsif ($text =~ /\.o / && $text =~ /\.a /) {
-        # libifying
-        handleLibLine($text, $line);
-
-#    } elsif ($text =~ /^cp /) {
-#        # copy file around
-#
-#    } elsif ($text =~ /^rm -f /) {
-#        # shell command
-#
-#    } elsif ($text =~ /^make[ \[]/) {
-#        # make output
-#
-#    } elsif ($text =~ /^echo /) {
-#        # echo to file
-#
-#    } elsif ($text =~ /^if /) {
-#        # shell conditional
-#
-#    } elsif ($text =~ /^tclsh /) {
-#        # translation stuff
-#
-#    } elsif ($text =~ /^umask /) {
-#        # handling boilerplates
-#
-#    } elsif ($text =~ /\$\(\:\)/) {
-#        # ignore
-#
-#    } elsif ($text =~ /^FLAGS=/) {
-#        # flags check for dependencies
-#
-#    } elsif ($text =~ /^'\/usr\/bin\/perl' -MError -e/) {
-#        # perl commands for copying files
-#
-#    } elsif ($text =~ /generate-cmdlist\.sh/) {
-#        # command for generating list of commands
-#
-#    } elsif ($text =~ /^test / && $text =~ /|| rm -f /) {
-#        # commands removing executables, if they exist
-#
-#    } elsif ($text =~ /new locations or Tcl/) {
-#        # command for detecting Tcl/Tk changes
-#
-#    } elsif ($text =~ /mkdir -p/) {
-#        # command creating path
-#
-#    } elsif ($text =~ /: no custom templates yet/) {
-#        # whatever
-
-    } else {
-#        print "Unhandled (line: $line): $text\n";
-    }
-}
-close(F);
-
-# use Data::Dumper;
-# print "Parsed build structure:\n";
-# print Dumper(%build_structure);
-
-# -------------------------------------------------------------------
-# Functions under here
-# -------------------------------------------------------------------
-my (%build_structure, @defines, @incpaths, @cflags, @sources);
-
-sub clearCompileStep
-{
-    @defines = ();
-    @incpaths = ();
-    @cflags = ();
-    @sources = ();
-}
-
-sub removeDuplicates
-{
-    my (%dupHash, $entry);
-    %dupHash = map { $_, 1 } @defines;
-    @defines = keys %dupHash;
-
-    %dupHash = map { $_, 1 } @incpaths;
-    @incpaths = keys %dupHash;
-
-    %dupHash = map { $_, 1 } @cflags;
-    @cflags = keys %dupHash;
-
-    %dupHash = map { $_, 1 } @sources;
-    @sources = keys %dupHash;
-}
-
-sub handleCompileLine
-{
-    my ($line, $lineno) = @_;
-    my @parts = split(' ', $line);
-    shift(@parts); # ignore cmd
-    while (my $part = shift @parts) {
-        if ("$part" eq "-o") {
-            # ignore object file
-            shift @parts;
-        } elsif ("$part" eq "-c") {
-            # ignore compile flag
-        } elsif ("$part" eq "-c") {
-        } elsif ($part =~ /^.?-I/) {
-            push(@incpaths, $part);
-        } elsif ($part =~ /^.?-D/) {
-            push(@defines, $part);
-        } elsif ($part =~ /^-/) {
-            push(@cflags, $part);
-        } elsif ($part =~ /\.(c|cc|cpp)$/) {
-            push(@sources, $part);
-        } else {
-            die "Unhandled compiler option @ line $lineno: $part";
-        }
-    }
-    #print "Sources: @sources\nCFlags: @cflags\nDefine: @defines\nIncpat: @incpaths\n";
-    #exit(1);
-}
-
-sub handleLibLine
-{
-    my ($line, $lineno) = @_;
-    my (@objfiles, @lflags, $libout, $part);
-    # kill cmd and rm 'prefix'
-    $line =~ s/^rm -f .* && .* rcs //;
-    my @parts = split(' ', $line);
-    while ($part = shift @parts) {
-        if ($part =~ /^-/) {
-            push(@lflags, $part);
-        } elsif ($part =~ /\.(o|obj)$/) {
-            push(@objfiles, $part);
-        } elsif ($part =~ /\.(a|lib)$/) {
-            $libout = $part;
-        } else {
-            die "Unhandled lib option @ line $lineno: $part";
-        }
-    }
-    #print "LibOut: '$libout'\nLFlags: @lflags\nOfiles: @objfiles\n";
-    #exit(1);
-    removeDuplicates();
-    push(@{$build_structure{"LIBS"}}, $libout);
-    @{$build_structure{"LIBS_${libout}"}} = ("_DEFINES", "_INCLUDES", "_CFLAGS", "_SOURCES",
-                                             "_OBJECTS");
-    @{$build_structure{"LIBS_${libout}_DEFINES"}} = @defines;
-    @{$build_structure{"LIBS_${libout}_INCLUDES"}} = @incpaths;
-    @{$build_structure{"LIBS_${libout}_CFLAGS"}} = @cflags;
-    @{$build_structure{"LIBS_${libout}_SOURCES"}} = @sources;
-    @{$build_structure{"LIBS_${libout}_OBJECTS"}} = @objfiles;
-    clearCompileStep();
-}
-
-sub handleLinkLine
-{
-    my ($line, $lineno) = @_;
-    my (@objfiles, @lflags, @libs, $appout, $part);
-    my @parts = split(' ', $line);
-    shift(@parts); # ignore cmd
-    while ($part = shift @parts) {
-        if ($part =~ /^-[GRIDO]/) {
-            # eat compiler flags
-        } elsif ("$part" eq "-o") {
-            $appout = shift @parts;
-        } elsif ($part =~ /^-/) {
-            push(@lflags, $part);
-        } elsif ($part =~ /\.(a|lib)$/) {
-            push(@libs, $part);
-        } elsif ($part =~ /\.(o|obj)$/) {
-            push(@objfiles, $part);
-        } else {
-            die "Unhandled lib option @ line $lineno: $part";
-        }
-    }
-    #print "AppOut: '$appout'\nLFlags: @lflags\nLibs  : @libs\nOfiles: @objfiles\n";
-    #exit(1);
-    removeDuplicates();
-    push(@{$build_structure{"APPS"}}, $appout);
-    @{$build_structure{"APPS_${appout}"}} = ("_DEFINES", "_INCLUDES", "_CFLAGS", "_LFLAGS",
-                                             "_SOURCES", "_OBJECTS", "_LIBS");
-    @{$build_structure{"APPS_${appout}_DEFINES"}} = @defines;
-    @{$build_structure{"APPS_${appout}_INCLUDES"}} = @incpaths;
-    @{$build_structure{"APPS_${appout}_CFLAGS"}} = @cflags;
-    @{$build_structure{"APPS_${appout}_LFLAGS"}} = @lflags;
-    @{$build_structure{"APPS_${appout}_SOURCES"}} = @sources;
-    @{$build_structure{"APPS_${appout}_OBJECTS"}} = @objfiles;
-    @{$build_structure{"APPS_${appout}_LIBS"}} = @libs;
-    clearCompileStep();
-}
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 05/25] contrib: remove 'convert-objects'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (2 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 04/25] contrib: remove 'buildsystems' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 06/25] contrib: remove 'diffall' Felipe Contreras
                   ` (21 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity since 2010, no tests, no documentation.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/convert-objects/convert-objects.c       | 329 ------------------------
 contrib/convert-objects/git-convert-objects.txt |  29 ---
 2 files changed, 358 deletions(-)
 delete mode 100644 contrib/convert-objects/convert-objects.c
 delete mode 100644 contrib/convert-objects/git-convert-objects.txt

diff --git a/contrib/convert-objects/convert-objects.c b/contrib/convert-objects/convert-objects.c
deleted file mode 100644
index f3b57bf..0000000
--- a/contrib/convert-objects/convert-objects.c
+++ /dev/null
@@ -1,329 +0,0 @@
-#include "cache.h"
-#include "blob.h"
-#include "commit.h"
-#include "tree.h"
-
-struct entry {
-	unsigned char old_sha1[20];
-	unsigned char new_sha1[20];
-	int converted;
-};
-
-#define MAXOBJECTS (1000000)
-
-static struct entry *convert[MAXOBJECTS];
-static int nr_convert;
-
-static struct entry * convert_entry(unsigned char *sha1);
-
-static struct entry *insert_new(unsigned char *sha1, int pos)
-{
-	struct entry *new = xcalloc(1, sizeof(struct entry));
-	hashcpy(new->old_sha1, sha1);
-	memmove(convert + pos + 1, convert + pos, (nr_convert - pos) * sizeof(struct entry *));
-	convert[pos] = new;
-	nr_convert++;
-	if (nr_convert == MAXOBJECTS)
-		die("you're kidding me - hit maximum object limit");
-	return new;
-}
-
-static struct entry *lookup_entry(unsigned char *sha1)
-{
-	int low = 0, high = nr_convert;
-
-	while (low < high) {
-		int next = (low + high) / 2;
-		struct entry *n = convert[next];
-		int cmp = hashcmp(sha1, n->old_sha1);
-		if (!cmp)
-			return n;
-		if (cmp < 0) {
-			high = next;
-			continue;
-		}
-		low = next+1;
-	}
-	return insert_new(sha1, low);
-}
-
-static void convert_binary_sha1(void *buffer)
-{
-	struct entry *entry = convert_entry(buffer);
-	hashcpy(buffer, entry->new_sha1);
-}
-
-static void convert_ascii_sha1(void *buffer)
-{
-	unsigned char sha1[20];
-	struct entry *entry;
-
-	if (get_sha1_hex(buffer, sha1))
-		die("expected sha1, got '%s'", (char *) buffer);
-	entry = convert_entry(sha1);
-	memcpy(buffer, sha1_to_hex(entry->new_sha1), 40);
-}
-
-static unsigned int convert_mode(unsigned int mode)
-{
-	unsigned int newmode;
-
-	newmode = mode & S_IFMT;
-	if (S_ISREG(mode))
-		newmode |= (mode & 0100) ? 0755 : 0644;
-	return newmode;
-}
-
-static int write_subdirectory(void *buffer, unsigned long size, const char *base, int baselen, unsigned char *result_sha1)
-{
-	char *new = xmalloc(size);
-	unsigned long newlen = 0;
-	unsigned long used;
-
-	used = 0;
-	while (size) {
-		int len = 21 + strlen(buffer);
-		char *path = strchr(buffer, ' ');
-		unsigned char *sha1;
-		unsigned int mode;
-		char *slash, *origpath;
-
-		if (!path || strtoul_ui(buffer, 8, &mode))
-			die("bad tree conversion");
-		mode = convert_mode(mode);
-		path++;
-		if (memcmp(path, base, baselen))
-			break;
-		origpath = path;
-		path += baselen;
-		slash = strchr(path, '/');
-		if (!slash) {
-			newlen += sprintf(new + newlen, "%o %s", mode, path);
-			new[newlen++] = '\0';
-			hashcpy((unsigned char *)new + newlen, (unsigned char *) buffer + len - 20);
-			newlen += 20;
-
-			used += len;
-			size -= len;
-			buffer = (char *) buffer + len;
-			continue;
-		}
-
-		newlen += sprintf(new + newlen, "%o %.*s", S_IFDIR, (int)(slash - path), path);
-		new[newlen++] = 0;
-		sha1 = (unsigned char *)(new + newlen);
-		newlen += 20;
-
-		len = write_subdirectory(buffer, size, origpath, slash-origpath+1, sha1);
-
-		used += len;
-		size -= len;
-		buffer = (char *) buffer + len;
-	}
-
-	write_sha1_file(new, newlen, tree_type, result_sha1);
-	free(new);
-	return used;
-}
-
-static void convert_tree(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-	void *orig_buffer = buffer;
-	unsigned long orig_size = size;
-
-	while (size) {
-		size_t len = 1+strlen(buffer);
-
-		convert_binary_sha1((char *) buffer + len);
-
-		len += 20;
-		if (len > size)
-			die("corrupt tree object");
-		size -= len;
-		buffer = (char *) buffer + len;
-	}
-
-	write_subdirectory(orig_buffer, orig_size, "", 0, result_sha1);
-}
-
-static unsigned long parse_oldstyle_date(const char *buf)
-{
-	char c, *p;
-	char buffer[100];
-	struct tm tm;
-	const char *formats[] = {
-		"%c",
-		"%a %b %d %T",
-		"%Z",
-		"%Y",
-		" %Y",
-		NULL
-	};
-	/* We only ever did two timezones in the bad old format .. */
-	const char *timezones[] = {
-		"PDT", "PST", "CEST", NULL
-	};
-	const char **fmt = formats;
-
-	p = buffer;
-	while (isspace(c = *buf))
-		buf++;
-	while ((c = *buf++) != '\n')
-		*p++ = c;
-	*p++ = 0;
-	buf = buffer;
-	memset(&tm, 0, sizeof(tm));
-	do {
-		const char *next = strptime(buf, *fmt, &tm);
-		if (next) {
-			if (!*next)
-				return mktime(&tm);
-			buf = next;
-		} else {
-			const char **p = timezones;
-			while (isspace(*buf))
-				buf++;
-			while (*p) {
-				if (!memcmp(buf, *p, strlen(*p))) {
-					buf += strlen(*p);
-					break;
-				}
-				p++;
-			}
-		}
-		fmt++;
-	} while (*buf && *fmt);
-	printf("left: %s\n", buf);
-	return mktime(&tm);
-}
-
-static int convert_date_line(char *dst, void **buf, unsigned long *sp)
-{
-	unsigned long size = *sp;
-	char *line = *buf;
-	char *next = strchr(line, '\n');
-	char *date = strchr(line, '>');
-	int len;
-
-	if (!next || !date)
-		die("missing or bad author/committer line %s", line);
-	next++; date += 2;
-
-	*buf = next;
-	*sp = size - (next - line);
-
-	len = date - line;
-	memcpy(dst, line, len);
-	dst += len;
-
-	/* Is it already in new format? */
-	if (isdigit(*date)) {
-		int datelen = next - date;
-		memcpy(dst, date, datelen);
-		return len + datelen;
-	}
-
-	/*
-	 * Hacky hacky: one of the sparse old-style commits does not have
-	 * any date at all, but we can fake it by using the committer date.
-	 */
-	if (*date == '\n' && strchr(next, '>'))
-		date = strchr(next, '>')+2;
-
-	return len + sprintf(dst, "%lu -0700\n", parse_oldstyle_date(date));
-}
-
-static void convert_date(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-	char *new = xmalloc(size + 100);
-	unsigned long newlen = 0;
-
-	/* "tree <sha1>\n" */
-	memcpy(new + newlen, buffer, 46);
-	newlen += 46;
-	buffer = (char *) buffer + 46;
-	size -= 46;
-
-	/* "parent <sha1>\n" */
-	while (!memcmp(buffer, "parent ", 7)) {
-		memcpy(new + newlen, buffer, 48);
-		newlen += 48;
-		buffer = (char *) buffer + 48;
-		size -= 48;
-	}
-
-	/* "author xyz <xyz> date" */
-	newlen += convert_date_line(new + newlen, &buffer, &size);
-	/* "committer xyz <xyz> date" */
-	newlen += convert_date_line(new + newlen, &buffer, &size);
-
-	/* Rest */
-	memcpy(new + newlen, buffer, size);
-	newlen += size;
-
-	write_sha1_file(new, newlen, commit_type, result_sha1);
-	free(new);
-}
-
-static void convert_commit(void *buffer, unsigned long size, unsigned char *result_sha1)
-{
-	void *orig_buffer = buffer;
-	unsigned long orig_size = size;
-
-	if (memcmp(buffer, "tree ", 5))
-		die("Bad commit '%s'", (char *) buffer);
-	convert_ascii_sha1((char *) buffer + 5);
-	buffer = (char *) buffer + 46;    /* "tree " + "hex sha1" + "\n" */
-	while (!memcmp(buffer, "parent ", 7)) {
-		convert_ascii_sha1((char *) buffer + 7);
-		buffer = (char *) buffer + 48;
-	}
-	convert_date(orig_buffer, orig_size, result_sha1);
-}
-
-static struct entry * convert_entry(unsigned char *sha1)
-{
-	struct entry *entry = lookup_entry(sha1);
-	enum object_type type;
-	void *buffer, *data;
-	unsigned long size;
-
-	if (entry->converted)
-		return entry;
-	data = read_sha1_file(sha1, &type, &size);
-	if (!data)
-		die("unable to read object %s", sha1_to_hex(sha1));
-
-	buffer = xmalloc(size);
-	memcpy(buffer, data, size);
-
-	if (type == OBJ_BLOB) {
-		write_sha1_file(buffer, size, blob_type, entry->new_sha1);
-	} else if (type == OBJ_TREE)
-		convert_tree(buffer, size, entry->new_sha1);
-	else if (type == OBJ_COMMIT)
-		convert_commit(buffer, size, entry->new_sha1);
-	else
-		die("unknown object type %d in %s", type, sha1_to_hex(sha1));
-	entry->converted = 1;
-	free(buffer);
-	free(data);
-	return entry;
-}
-
-int main(int argc, char **argv)
-{
-	unsigned char sha1[20];
-	struct entry *entry;
-
-	setup_git_directory();
-
-	if (argc != 2)
-		usage("git-convert-objects <sha1>");
-	if (get_sha1(argv[1], sha1))
-		die("Not a valid object name %s", argv[1]);
-
-	entry = convert_entry(sha1);
-	printf("new sha1: %s\n", sha1_to_hex(entry->new_sha1));
-	return 0;
-}
diff --git a/contrib/convert-objects/git-convert-objects.txt b/contrib/convert-objects/git-convert-objects.txt
deleted file mode 100644
index 0565d83..0000000
--- a/contrib/convert-objects/git-convert-objects.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-git-convert-objects(1)
-======================
-
-NAME
-----
-git-convert-objects - Converts old-style git repository
-
-
-SYNOPSIS
---------
-[verse]
-'git-convert-objects'
-
-DESCRIPTION
------------
-Converts old-style git repository to the latest format
-
-
-Author
-------
-Written by Linus Torvalds <torvalds@osdl.org>
-
-Documentation
---------------
-Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel.org>.
-
-GIT
----
-Part of the gitlink:git[7] suite
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 06/25] contrib: remove 'diffall'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (3 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 05/25] contrib: remove 'convert-objects' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09 15:12   ` Tim Henigan
       [not found]   ` <CAFouetj=30Wd_CDiXA0UqqKNdfJSv+C5mWbMJPOkEdqxr7k54w@mail.gmail.com>
  2014-05-09  0:58 ` [PATCH v1 07/25] contrib: remove 'git-jump' Felipe Contreras
                   ` (20 subsequent siblings)
  25 siblings, 2 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras, Tim Henigan

No activity since 2010, no tests.

Cc: Tim Henigan <tim.henigan@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/diffall/README      |  31 ------
 contrib/diffall/git-diffall | 257 --------------------------------------------
 2 files changed, 288 deletions(-)
 delete mode 100644 contrib/diffall/README
 delete mode 100755 contrib/diffall/git-diffall

diff --git a/contrib/diffall/README b/contrib/diffall/README
deleted file mode 100644
index 507f17d..0000000
--- a/contrib/diffall/README
+++ /dev/null
@@ -1,31 +0,0 @@
-The git-diffall script provides a directory based diff mechanism
-for git.
-
-To determine what diff viewer is used, the script requires either
-the 'diff.tool' or 'merge.tool' configuration option to be set.
-
-This script is compatible with most common forms used to specify a
-range of revisions to diff:
-
-  1. git diffall: shows diff between working tree and staged changes
-  2. git diffall --cached [<commit>]: shows diff between staged
-     changes and HEAD (or other named commit)
-  3. git diffall <commit>: shows diff between working tree and named
-     commit
-  4. git diffall <commit> <commit>: show diff between two named commits
-  5. git diffall <commit>..<commit>: same as above
-  6. git diffall <commit>...<commit>: show the changes on the branch
-     containing and up to the second, starting at a common ancestor
-     of both <commit>
-
-Note: all forms take an optional path limiter [-- <path>*]
-
-The '--extcmd=<command>' option allows the user to specify a custom
-command for viewing diffs.  When given, configured defaults are
-ignored and the script runs $command $LOCAL $REMOTE.  Additionally,
-$BASE is set in the environment.
-
-This script is based on an example provided by Thomas Rast on the
-Git list [1]:
-
-[1] http://thread.gmane.org/gmane.comp.version-control.git/124807
diff --git a/contrib/diffall/git-diffall b/contrib/diffall/git-diffall
deleted file mode 100755
index 84f2b65..0000000
--- a/contrib/diffall/git-diffall
+++ /dev/null
@@ -1,257 +0,0 @@
-#!/bin/sh
-# Copyright 2010 - 2012, Tim Henigan <tim.henigan@gmail.com>
-#
-# Perform a directory diff between commits in the repository using
-# the external diff or merge tool specified in the user's config.
-
-USAGE='[--cached] [--copy-back] [-x|--extcmd=<command>] <commit>{0,2} [-- <path>*]
-
-    --cached     Compare to the index rather than the working tree.
-
-    --copy-back  Copy files back to the working tree when the diff
-                 tool exits (in case they were modified by the
-                 user).  This option is only valid if the diff
-                 compared with the working tree.
-
-    -x=<command>
-    --extcmd=<command>  Specify a custom command for viewing diffs.
-                 git-diffall ignores the configured defaults and
-                 runs $command $LOCAL $REMOTE when this option is
-                 specified. Additionally, $BASE is set in the
-                 environment.
-'
-
-SUBDIRECTORY_OK=1
-. "$(git --exec-path)/git-sh-setup"
-
-TOOL_MODE=diff
-. "$(git --exec-path)/git-mergetool--lib"
-
-merge_tool="$(get_merge_tool)"
-if test -z "$merge_tool"
-then
-	echo "Error: Either the 'diff.tool' or 'merge.tool' option must be set."
-	usage
-fi
-
-start_dir=$(pwd)
-
-# All the file paths returned by the diff command are relative to the root
-# of the working copy. So if the script is called from a subdirectory, it
-# must switch to the root of working copy before trying to use those paths.
-cdup=$(git rev-parse --show-cdup) &&
-cd "$cdup" || {
-	echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
-	exit 1
-}
-
-# set up temp dir
-tmp=$(perl -e 'use File::Temp qw(tempdir);
-	$t=tempdir("/tmp/git-diffall.XXXXX") or exit(1);
-	print $t') || exit 1
-trap 'rm -rf "$tmp"' EXIT
-
-left=
-right=
-paths=
-dashdash_seen=
-compare_staged=
-merge_base=
-left_dir=
-right_dir=
-diff_tool=
-copy_back=
-
-while test $# != 0
-do
-	case "$1" in
-	-h|--h|--he|--hel|--help)
-		usage
-		;;
-	--cached)
-		compare_staged=1
-		;;
-	--copy-back)
-		copy_back=1
-		;;
-	-x|--e|--ex|--ext|--extc|--extcm|--extcmd)
-		if test $# = 1
-		then
-			echo You must specify the tool for use with --extcmd
-			usage
-		else
-			diff_tool=$2
-			shift
-		fi
-		;;
-	--)
-		dashdash_seen=1
-		;;
-	-*)
-		echo Invalid option: "$1"
-		usage
-		;;
-	*)
-		# could be commit, commit range or path limiter
-		case "$1" in
-		*...*)
-			left=${1%...*}
-			right=${1#*...}
-			merge_base=1
-			;;
-		*..*)
-			left=${1%..*}
-			right=${1#*..}
-			;;
-		*)
-			if test -n "$dashdash_seen"
-			then
-				paths="$paths$1 "
-			elif test -z "$left"
-			then
-				left=$1
-			elif test -z "$right"
-			then
-				right=$1
-			else
-				paths="$paths$1 "
-			fi
-			;;
-		esac
-		;;
-	esac
-	shift
-done
-
-# Determine the set of files which changed
-if test -n "$left" && test -n "$right"
-then
-	left_dir="cmt-$(git rev-parse --short $left)"
-	right_dir="cmt-$(git rev-parse --short $right)"
-
-	if test -n "$compare_staged"
-	then
-		usage
-	elif test -n "$merge_base"
-	then
-		git diff --name-only "$left"..."$right" -- $paths >"$tmp/filelist"
-	else
-		git diff --name-only "$left" "$right" -- $paths >"$tmp/filelist"
-	fi
-elif test -n "$left"
-then
-	left_dir="cmt-$(git rev-parse --short $left)"
-
-	if test -n "$compare_staged"
-	then
-		right_dir="staged"
-		git diff --name-only --cached "$left" -- $paths >"$tmp/filelist"
-	else
-		right_dir="working_tree"
-		git diff --name-only "$left" -- $paths >"$tmp/filelist"
-	fi
-else
-	left_dir="HEAD"
-
-	if test -n "$compare_staged"
-	then
-		right_dir="staged"
-		git diff --name-only --cached -- $paths >"$tmp/filelist"
-	else
-		right_dir="working_tree"
-		git diff --name-only -- $paths >"$tmp/filelist"
-	fi
-fi
-
-# Exit immediately if there are no diffs
-if test ! -s "$tmp/filelist"
-then
-	exit 0
-fi
-
-if test -n "$copy_back" && test "$right_dir" != "working_tree"
-then
-	echo "--copy-back is only valid when diff includes the working tree."
-	exit 1
-fi
-
-# Create the named tmp directories that will hold the files to be compared
-mkdir -p "$tmp/$left_dir" "$tmp/$right_dir"
-
-# Populate the tmp/right_dir directory with the files to be compared
-while read name
-do
-	if test -n "$right"
-	then
-		ls_list=$(git ls-tree $right "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			git show "$right":"$name" >"$tmp/$right_dir/$name" || true
-		fi
-	elif test -n "$compare_staged"
-	then
-		ls_list=$(git ls-files -- "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			git show :"$name" >"$tmp/$right_dir/$name"
-		fi
-	else
-		if test -e "$name"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			cp "$name" "$tmp/$right_dir/$name"
-		fi
-	fi
-done < "$tmp/filelist"
-
-# Populate the tmp/left_dir directory with the files to be compared
-while read name
-do
-	if test -n "$left"
-	then
-		ls_list=$(git ls-tree $left "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-			git show "$left":"$name" >"$tmp/$left_dir/$name" || true
-		fi
-	else
-		if test -n "$compare_staged"
-		then
-			ls_list=$(git ls-tree HEAD "$name")
-			if test -n "$ls_list"
-			then
-				mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-				git show HEAD:"$name" >"$tmp/$left_dir/$name"
-			fi
-		else
-			mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-			git show :"$name" >"$tmp/$left_dir/$name"
-		fi
-	fi
-done < "$tmp/filelist"
-
-LOCAL="$tmp/$left_dir"
-REMOTE="$tmp/$right_dir"
-
-if test -n "$diff_tool"
-then
-	export BASE
-	eval $diff_tool '"$LOCAL"' '"$REMOTE"'
-else
-	run_merge_tool "$merge_tool" false
-fi
-
-# Copy files back to the working dir, if requested
-if test -n "$copy_back" && test "$right_dir" = "working_tree"
-then
-	cd "$start_dir"
-	git_top_dir=$(git rev-parse --show-toplevel)
-	find "$tmp/$right_dir" -type f |
-	while read file
-	do
-		cp "$file" "$git_top_dir/${file#$tmp/$right_dir/}"
-	done
-fi
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 07/25] contrib: remove 'git-jump'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (4 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 06/25] contrib: remove 'diffall' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  2:03   ` Jeff King
  2014-05-09  0:58 ` [PATCH v1 08/25] contrib: remove 'git-shell-commands' Felipe Contreras
                   ` (19 subsequent siblings)
  25 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity, no tests.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/git-jump/README   | 92 -----------------------------------------------
 contrib/git-jump/git-jump | 69 -----------------------------------
 2 files changed, 161 deletions(-)
 delete mode 100644 contrib/git-jump/README
 delete mode 100755 contrib/git-jump/git-jump

diff --git a/contrib/git-jump/README b/contrib/git-jump/README
deleted file mode 100644
index 1cebc32..0000000
--- a/contrib/git-jump/README
+++ /dev/null
@@ -1,92 +0,0 @@
-git-jump
-========
-
-Git-jump is a script for helping you jump to "interesting" parts of your
-project in your editor. It works by outputting a set of interesting
-spots in the "quickfix" format, which editors like vim can use as a
-queue of places to visit (this feature is usually used to jump to errors
-produced by a compiler). For example, given a diff like this:
-
-------------------------------------
-diff --git a/foo.c b/foo.c
-index a655540..5a59044 100644
---- a/foo.c
-+++ b/foo.c
-@@ -1,3 +1,3 @@
- int main(void) {
--  printf("hello word!\n");
-+  printf("hello world!\n");
- }
------------------------------------
-
-git-jump will feed this to the editor:
-
------------------------------------
-foo.c:2: printf("hello word!\n");
------------------------------------
-
-Obviously this trivial case isn't that interesting; you could just open
-`foo.c` yourself. But when you have many changes scattered across a
-project, you can use the editor's support to "jump" from point to point.
-
-Git-jump can generate three types of interesting lists:
-
-  1. The beginning of any diff hunks.
-
-  2. The beginning of any merge conflict markers.
-
-  3. Any grep matches.
-
-
-Using git-jump
---------------
-
-To use it, just drop git-jump in your PATH, and then invoke it like
-this:
-
---------------------------------------------------
-# jump to changes not yet staged for commit
-git jump diff
-
-# jump to changes that are staged for commit; you can give
-# arbitrary diff options
-git jump diff --cached
-
-# jump to merge conflicts
-git jump merge
-
-# jump to all instances of foo_bar
-git jump grep foo_bar
-
-# same as above, but case-insensitive; you can give
-# arbitrary grep options
-git jump grep -i foo_bar
---------------------------------------------------
-
-
-Related Programs
-----------------
-
-You can accomplish some of the same things with individual tools. For
-example, you can use `git mergetool` to start vimdiff on each unmerged
-file. `git jump merge` is for the vim-wielding luddite who just wants to
-jump straight to the conflict text with no fanfare.
-
-As of git v1.7.2, `git grep` knows the `--open-files-in-pager` option,
-which does something similar to `git jump grep`. However, it is limited
-to positioning the cursor to the correct line in only the first file,
-leaving you to locate subsequent hits in that file or other files using
-the editor or pager. By contrast, git-jump provides the editor with a
-complete list of files and line numbers for each match.
-
-
-Limitations
------------
-
-This scripts was written and tested with vim. Given that the quickfix
-format is the same as what gcc produces, I expect emacs users have a
-similar feature for iterating through the list, but I know nothing about
-how to activate it.
-
-The shell snippets to generate the quickfix lines will almost certainly
-choke on filenames with exotic characters (like newlines).
diff --git a/contrib/git-jump/git-jump b/contrib/git-jump/git-jump
deleted file mode 100755
index dc90cd6..0000000
--- a/contrib/git-jump/git-jump
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/bin/sh
-
-usage() {
-	cat <<\EOF
-usage: git jump <mode> [<args>]
-
-Jump to interesting elements in an editor.
-The <mode> parameter is one of:
-
-diff: elements are diff hunks. Arguments are given to diff.
-
-merge: elements are merge conflicts. Arguments are ignored.
-
-grep: elements are grep hits. Arguments are given to grep.
-EOF
-}
-
-open_editor() {
-	editor=`git var GIT_EDITOR`
-	eval "$editor -q \$1"
-}
-
-mode_diff() {
-	git diff --no-prefix --relative "$@" |
-	perl -ne '
-	if (m{^\+\+\+ (.*)}) { $file = $1; next }
-	defined($file) or next;
-	if (m/^@@ .*\+(\d+)/) { $line = $1; next }
-	defined($line) or next;
-	if (/^ /) { $line++; next }
-	if (/^[-+]\s*(.*)/) {
-		print "$file:$line: $1\n";
-		$line = undef;
-	}
-	'
-}
-
-mode_merge() {
-	git ls-files -u |
-	perl -pe 's/^.*?\t//' |
-	sort -u |
-	while IFS= read fn; do
-		grep -Hn '^<<<<<<<' "$fn"
-	done
-}
-
-# Grep -n generates nice quickfix-looking lines by itself,
-# but let's clean up extra whitespace, so they look better if the
-# editor shows them to us in the status bar.
-mode_grep() {
-	git grep -n "$@" |
-	perl -pe '
-	s/[ \t]+/ /g;
-	s/^ *//;
-	'
-}
-
-if test $# -lt 1; then
-	usage >&2
-	exit 1
-fi
-mode=$1; shift
-
-trap 'rm -f "$tmp"' 0 1 2 3 15
-tmp=`mktemp -t git-jump.XXXXXX` || exit 1
-type "mode_$mode" >/dev/null 2>&1 || { usage >&2; exit 1; }
-"mode_$mode" "$@" >"$tmp"
-test -s "$tmp" || exit 0
-open_editor "$tmp"
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 08/25] contrib: remove 'git-shell-commands'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (5 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 07/25] contrib: remove 'git-jump' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 09/25] contrib: remove 'gitview' Felipe Contreras
                   ` (18 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity, no tests.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/git-shell-commands/README | 18 ------------------
 contrib/git-shell-commands/help   | 18 ------------------
 contrib/git-shell-commands/list   | 10 ----------
 3 files changed, 46 deletions(-)
 delete mode 100644 contrib/git-shell-commands/README
 delete mode 100755 contrib/git-shell-commands/help
 delete mode 100755 contrib/git-shell-commands/list

diff --git a/contrib/git-shell-commands/README b/contrib/git-shell-commands/README
deleted file mode 100644
index 438463b..0000000
--- a/contrib/git-shell-commands/README
+++ /dev/null
@@ -1,18 +0,0 @@
-Sample programs callable through git-shell.  Place a directory named
-'git-shell-commands' in the home directory of a user whose shell is
-git-shell.  Then anyone logging in as that user will be able to run
-executables in the 'git-shell-commands' directory.
-
-Provided commands:
-
-help: Prints out the names of available commands.  When run
-interactively, git-shell will automatically run 'help' on startup,
-provided it exists.
-
-list: Displays any bare repository whose name ends with ".git" under
-user's home directory.  No other git repositories are visible,
-although they might be clonable through git-shell.  'list' is designed
-to minimize the number of calls to git that must be made in finding
-available repositories; if your setup has additional repositories that
-should be user-discoverable, you may wish to modify 'list'
-accordingly.
diff --git a/contrib/git-shell-commands/help b/contrib/git-shell-commands/help
deleted file mode 100755
index 535770c..0000000
--- a/contrib/git-shell-commands/help
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/sh
-
-if tty -s
-then
-	echo "Run 'help' for help, or 'exit' to leave.  Available commands:"
-else
-	echo "Run 'help' for help.  Available commands:"
-fi
-
-cd "$(dirname "$0")"
-
-for cmd in *
-do
-	case "$cmd" in
-	help) ;;
-	*) [ -f "$cmd" ] && [ -x "$cmd" ] && echo "$cmd" ;;
-	esac
-done
diff --git a/contrib/git-shell-commands/list b/contrib/git-shell-commands/list
deleted file mode 100755
index 6f89938..0000000
--- a/contrib/git-shell-commands/list
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-print_if_bare_repo='
-	if "$(git --git-dir="$1" rev-parse --is-bare-repository)" = true
-	then
-		printf "%s\n" "${1#./}"
-	fi
-'
-
-find -type d -name "*.git" -exec sh -c "$print_if_bare_repo" -- \{} \; -prune 2>/dev/null
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 09/25] contrib: remove 'gitview'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (6 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 08/25] contrib: remove 'git-shell-commands' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 10/25] contrib: reomve 'thunderbird-patch-inline' Felipe Contreras
                   ` (17 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras, Aneesh Kumar K.V

No activity since 2007.

Better out-of-tree tools out there.

Cc: Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/gitview/gitview     | 1305 -------------------------------------------
 contrib/gitview/gitview.txt |   57 --
 2 files changed, 1362 deletions(-)
 delete mode 100755 contrib/gitview/gitview
 delete mode 100644 contrib/gitview/gitview.txt

diff --git a/contrib/gitview/gitview b/contrib/gitview/gitview
deleted file mode 100755
index 4e23c65..0000000
--- a/contrib/gitview/gitview
+++ /dev/null
@@ -1,1305 +0,0 @@
-#! /usr/bin/env python
-
-# 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.
-
-""" gitview
-GUI browser for git repository
-This program is based on bzrk by Scott James Remnant <scott@ubuntu.com>
-"""
-__copyright__ = "Copyright (C) 2006 Hewlett-Packard Development Company, L.P."
-__copyright__ = "Copyright (C) 2007 Aneesh Kumar K.V <aneesh.kumar@gmail.com"
-__author__    = "Aneesh Kumar K.V <aneesh.kumar@gmail.com>"
-
-
-import sys
-import os
-import gtk
-import pygtk
-import pango
-import re
-import time
-import gobject
-import cairo
-import math
-import string
-import fcntl
-
-have_gtksourceview2 = False
-have_gtksourceview = False
-try:
-    import gtksourceview2
-    have_gtksourceview2 = True
-except ImportError:
-    try:
-        import gtksourceview
-        have_gtksourceview = True
-    except ImportError:
-        print "Running without gtksourceview2 or gtksourceview module"
-
-re_ident = re.compile('(author|committer) (?P<ident>.*) (?P<epoch>\d+) (?P<tz>[+-]\d{4})')
-
-def list_to_string(args, skip):
-	count = len(args)
-	i = skip
-	str_arg=" "
-	while (i < count ):
-		str_arg = str_arg + args[i]
-		str_arg = str_arg + " "
-		i = i+1
-
-	return str_arg
-
-def show_date(epoch, tz):
-	secs = float(epoch)
-	tzsecs = float(tz[1:3]) * 3600
-	tzsecs += float(tz[3:5]) * 60
-	if (tz[0] == "+"):
-		secs += tzsecs
-	else:
-		secs -= tzsecs
-
-	return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(secs))
-
-def get_source_buffer_and_view():
-	if have_gtksourceview2:
-		buffer = gtksourceview2.Buffer()
-		slm = gtksourceview2.LanguageManager()
-		gsl = slm.get_language("diff")
-		buffer.set_highlight_syntax(True)
-		buffer.set_language(gsl)
-		view = gtksourceview2.View(buffer)
-	elif have_gtksourceview:
-		buffer = gtksourceview.SourceBuffer()
-		slm = gtksourceview.SourceLanguagesManager()
-		gsl = slm.get_language_from_mime_type("text/x-patch")
-		buffer.set_highlight(True)
-		buffer.set_language(gsl)
-		view = gtksourceview.SourceView(buffer)
-	else:
-		buffer = gtk.TextBuffer()
-		view = gtk.TextView(buffer)
-	return (buffer, view)
-
-
-class CellRendererGraph(gtk.GenericCellRenderer):
-	"""Cell renderer for directed graph.
-
-	This module contains the implementation of a custom GtkCellRenderer that
-	draws part of the directed graph based on the lines suggested by the code
-	in graph.py.
-
-	Because we're shiny, we use Cairo to do this, and because we're naughty
-	we cheat and draw over the bits of the TreeViewColumn that are supposed to
-	just be for the background.
-
-	Properties:
-	node              (column, colour, [ names ]) tuple to draw revision node,
-	in_lines          (start, end, colour) tuple list to draw inward lines,
-	out_lines         (start, end, colour) tuple list to draw outward lines.
-	"""
-
-	__gproperties__ = {
-	"node":         ( gobject.TYPE_PYOBJECT, "node",
-			  "revision node instruction",
-			  gobject.PARAM_WRITABLE
-			),
-	"in-lines":     ( gobject.TYPE_PYOBJECT, "in-lines",
-			  "instructions to draw lines into the cell",
-			  gobject.PARAM_WRITABLE
-			),
-	"out-lines":    ( gobject.TYPE_PYOBJECT, "out-lines",
-			  "instructions to draw lines out of the cell",
-			  gobject.PARAM_WRITABLE
-			),
-	}
-
-	def do_set_property(self, property, value):
-		"""Set properties from GObject properties."""
-		if property.name == "node":
-			self.node = value
-		elif property.name == "in-lines":
-			self.in_lines = value
-		elif property.name == "out-lines":
-			self.out_lines = value
-		else:
-			raise AttributeError, "no such property: '%s'" % property.name
-
-	def box_size(self, widget):
-		"""Calculate box size based on widget's font.
-
-		Cache this as it's probably expensive to get.  It ensures that we
-		draw the graph at least as large as the text.
-		"""
-		try:
-			return self._box_size
-		except AttributeError:
-			pango_ctx = widget.get_pango_context()
-			font_desc = widget.get_style().font_desc
-			metrics = pango_ctx.get_metrics(font_desc)
-
-			ascent = pango.PIXELS(metrics.get_ascent())
-			descent = pango.PIXELS(metrics.get_descent())
-
-			self._box_size = ascent + descent + 6
-			return self._box_size
-
-	def set_colour(self, ctx, colour, bg, fg):
-		"""Set the context source colour.
-
-		Picks 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.
-		"""
-		colours = [
-		    ( 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 ),
-		    ]
-
-		colour %= len(colours)
-		red   = (colours[colour][0] * fg) or bg
-		green = (colours[colour][1] * fg) or bg
-		blue  = (colours[colour][2] * fg) or bg
-
-		ctx.set_source_rgb(red, green, blue)
-
-	def on_get_size(self, widget, cell_area):
-		"""Return the size we need for this cell.
-
-		Each cell is drawn individually and is only as wide as it needs
-		to be, we let the TreeViewColumn take care of making them all
-		line up.
-		"""
-		box_size = self.box_size(widget)
-
-		cols = self.node[0]
-		for start, end, colour in self.in_lines + self.out_lines:
-			cols = int(max(cols, start, end))
-
-		(column, colour, names) = self.node
-		names_len = 0
-		if (len(names) != 0):
-			for item in names:
-				names_len += len(item)
-
-		width = box_size * (cols + 1 ) + names_len
-		height = box_size
-
-		# FIXME I have no idea how to use cell_area properly
-		return (0, 0, width, height)
-
-	def on_render(self, window, widget, bg_area, cell_area, exp_area, flags):
-		"""Render an individual cell.
-
-		Draws the cell contents using cairo, taking care to clip what we
-		do to within the background area so we don't draw over other cells.
-		Note that we're a bit naughty there and should really be drawing
-		in the cell_area (or even the exposed area), but we explicitly don't
-		want any gutter.
-
-		We try and be a little clever, if the line we need to draw is going
-		to cross other columns we actually draw it as in the .---' style
-		instead of a pure diagonal ... this reduces confusion by an
-		incredible amount.
-		"""
-		ctx = window.cairo_create()
-		ctx.rectangle(bg_area.x, bg_area.y, bg_area.width, bg_area.height)
-		ctx.clip()
-
-		box_size = self.box_size(widget)
-
-		ctx.set_line_width(box_size / 8)
-		ctx.set_line_cap(cairo.LINE_CAP_SQUARE)
-
-		# Draw lines into the cell
-		for start, end, colour in self.in_lines:
-			ctx.move_to(cell_area.x + box_size * start + box_size / 2,
-					bg_area.y - bg_area.height / 2)
-
-			if start - end > 1:
-				ctx.line_to(cell_area.x + box_size * start, bg_area.y)
-				ctx.line_to(cell_area.x + box_size * end + box_size, bg_area.y)
-			elif start - end < -1:
-				ctx.line_to(cell_area.x + box_size * start + box_size,
-						bg_area.y)
-				ctx.line_to(cell_area.x + box_size * end, bg_area.y)
-
-			ctx.line_to(cell_area.x + box_size * end + box_size / 2,
-					bg_area.y + bg_area.height / 2)
-
-			self.set_colour(ctx, colour, 0.0, 0.65)
-			ctx.stroke()
-
-		# Draw lines out of the cell
-		for start, end, colour in self.out_lines:
-			ctx.move_to(cell_area.x + box_size * start + box_size / 2,
-					bg_area.y + bg_area.height / 2)
-
-			if start - end > 1:
-				ctx.line_to(cell_area.x + box_size * start,
-						bg_area.y + bg_area.height)
-				ctx.line_to(cell_area.x + box_size * end + box_size,
-						bg_area.y + bg_area.height)
-			elif start - end < -1:
-				ctx.line_to(cell_area.x + box_size * start + box_size,
-						bg_area.y + bg_area.height)
-				ctx.line_to(cell_area.x + box_size * end,
-						bg_area.y + bg_area.height)
-
-			ctx.line_to(cell_area.x + box_size * end + box_size / 2,
-					bg_area.y + bg_area.height / 2 + bg_area.height)
-
-			self.set_colour(ctx, colour, 0.0, 0.65)
-			ctx.stroke()
-
-		# Draw the revision node in the right column
-		(column, colour, names) = self.node
-		ctx.arc(cell_area.x + box_size * column + box_size / 2,
-				cell_area.y + cell_area.height / 2,
-				box_size / 4, 0, 2 * math.pi)
-
-
-		self.set_colour(ctx, colour, 0.0, 0.5)
-		ctx.stroke_preserve()
-
-		self.set_colour(ctx, colour, 0.5, 1.0)
-		ctx.fill_preserve()
-
-		if (len(names) != 0):
-			name = " "
-			for item in names:
-				name = name + item + " "
-
-			ctx.set_font_size(13)
-			if (flags & 1):
-				self.set_colour(ctx, colour, 0.5, 1.0)
-			else:
-				self.set_colour(ctx, colour, 0.0, 0.5)
-			ctx.show_text(name)
-
-class Commit(object):
-	""" This represent a commit object obtained after parsing the git-rev-list
-	output """
-
-	__slots__ = ['children_sha1', 'message', 'author', 'date', 'committer',
-				 'commit_date', 'commit_sha1', 'parent_sha1']
-
-	children_sha1 = {}
-
-	def __init__(self, commit_lines):
-		self.message		= ""
-		self.author		= ""
-		self.date		= ""
-		self.committer		= ""
-		self.commit_date	= ""
-		self.commit_sha1	= ""
-		self.parent_sha1	= [ ]
-		self.parse_commit(commit_lines)
-
-
-	def parse_commit(self, commit_lines):
-
-		# First line is the sha1 lines
-		line = string.strip(commit_lines[0])
-		sha1 = re.split(" ", line)
-		self.commit_sha1 = sha1[0]
-		self.parent_sha1 = sha1[1:]
-
-		#build the child list
-		for parent_id in self.parent_sha1:
-			try:
-				Commit.children_sha1[parent_id].append(self.commit_sha1)
-			except KeyError:
-				Commit.children_sha1[parent_id] = [self.commit_sha1]
-
-		# IF we don't have parent
-		if (len(self.parent_sha1) == 0):
-			self.parent_sha1 = [0]
-
-		for line in commit_lines[1:]:
-			m = re.match("^ ", line)
-			if (m != None):
-				# First line of the commit message used for short log
-				if self.message == "":
-					self.message = string.strip(line)
-				continue
-
-			m = re.match("tree", line)
-			if (m != None):
-				continue
-
-			m = re.match("parent", line)
-			if (m != None):
-				continue
-
-			m = re_ident.match(line)
-			if (m != None):
-				date = show_date(m.group('epoch'), m.group('tz'))
-				if m.group(1) == "author":
-					self.author = m.group('ident')
-					self.date = date
-				elif m.group(1) == "committer":
-					self.committer = m.group('ident')
-					self.commit_date = date
-
-				continue
-
-	def get_message(self, with_diff=0):
-		if (with_diff == 1):
-			message = self.diff_tree()
-		else:
-			fp = os.popen("git cat-file commit " + self.commit_sha1)
-			message = fp.read()
-			fp.close()
-
-		return message
-
-	def diff_tree(self):
-		fp = os.popen("git diff-tree --pretty --cc  -v -p --always " +  self.commit_sha1)
-		diff = fp.read()
-		fp.close()
-		return diff
-
-class AnnotateWindow(object):
-	"""Annotate window.
-	This object represents and manages a single window containing the
-	annotate information of the file
-	"""
-
-	def __init__(self):
-		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-		self.window.set_border_width(0)
-		self.window.set_title("Git repository browser annotation window")
-		self.prev_read = ""
-
-		# Use two thirds of the screen by default
-		screen = self.window.get_screen()
-		monitor = screen.get_monitor_geometry(0)
-		width = int(monitor.width * 0.66)
-		height = int(monitor.height * 0.66)
-		self.window.set_default_size(width, height)
-
-	def add_file_data(self, filename, commit_sha1, line_num):
-		fp = os.popen("git cat-file blob " + commit_sha1 +":"+filename)
-		i = 1;
-		for line in fp.readlines():
-			line = string.rstrip(line)
-			self.model.append(None, ["HEAD", filename, line, i])
-			i = i+1
-		fp.close()
-
-		# now set the cursor position
-		self.treeview.set_cursor(line_num-1)
-		self.treeview.grab_focus()
-
-	def _treeview_cursor_cb(self, *args):
-		"""Callback for when the treeview cursor changes."""
-		(path, col) = self.treeview.get_cursor()
-		commit_sha1 = self.model[path][0]
-		commit_msg = ""
-		fp = os.popen("git cat-file commit " + commit_sha1)
-		for line in fp.readlines():
-			commit_msg =  commit_msg + line
-		fp.close()
-
-		self.commit_buffer.set_text(commit_msg)
-
-	def _treeview_row_activated(self, *args):
-		"""Callback for when the treeview row gets selected."""
-		(path, col) = self.treeview.get_cursor()
-		commit_sha1 = self.model[path][0]
-		filename    = self.model[path][1]
-		line_num    = self.model[path][3]
-
-		window = AnnotateWindow();
-		fp = os.popen("git rev-parse "+ commit_sha1 + "~1")
-		commit_sha1 = string.strip(fp.readline())
-		fp.close()
-		window.annotate(filename, commit_sha1, line_num)
-
-	def data_ready(self, source, condition):
-		while (1):
-			try :
-				# A simple readline doesn't work
-				# a readline bug ??
-				buffer = source.read(100)
-
-			except:
-				# resource temporary not available
-				return True
-
-			if (len(buffer) == 0):
-				gobject.source_remove(self.io_watch_tag)
-				source.close()
-				return False
-
-			if (self.prev_read != ""):
-				buffer = self.prev_read + buffer
-				self.prev_read = ""
-
-			if (buffer[len(buffer) -1] != '\n'):
-				try:
-					newline_index = buffer.rindex("\n")
-				except ValueError:
-					newline_index = 0
-
-				self.prev_read = buffer[newline_index:(len(buffer))]
-				buffer = buffer[0:newline_index]
-
-			for buff in buffer.split("\n"):
-				annotate_line = re.compile('^([0-9a-f]{40}) (.+) (.+) (.+)$')
-				m = annotate_line.match(buff)
-				if not m:
-					annotate_line = re.compile('^(filename) (.+)$')
-					m = annotate_line.match(buff)
-					if not m:
-						continue
-					filename = m.group(2)
-				else:
-					self.commit_sha1 = m.group(1)
-					self.source_line = int(m.group(2))
-					self.result_line = int(m.group(3))
-					self.count	    = int(m.group(4))
-					#set the details only when we have the file name
-					continue
-
-				while (self.count > 0):
-					# set at result_line + count-1 the sha1 as commit_sha1
-					self.count = self.count - 1
-					iter = self.model.iter_nth_child(None, self.result_line + self.count-1)
-					self.model.set(iter, 0, self.commit_sha1, 1, filename, 3, self.source_line)
-
-
-	def annotate(self, filename, commit_sha1, line_num):
-		# verify the commit_sha1 specified has this filename
-
-		fp = os.popen("git ls-tree "+ commit_sha1 + " -- " + filename)
-		line = string.strip(fp.readline())
-		if line == '':
-			# pop up the message the file is not there as a part of the commit
-			fp.close()
-			dialog = gtk.MessageDialog(parent=None, flags=0,
-					type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_CLOSE,
-					message_format=None)
-			dialog.set_markup("The file %s is not present in the parent commit %s" % (filename, commit_sha1))
-			dialog.run()
-			dialog.destroy()
-			return
-
-		fp.close()
-
-		vpan = gtk.VPaned();
-		self.window.add(vpan);
-		vpan.show()
-
-		scrollwin = gtk.ScrolledWindow()
-		scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		scrollwin.set_shadow_type(gtk.SHADOW_IN)
-		vpan.pack1(scrollwin, True, True);
-		scrollwin.show()
-
-		self.model = gtk.TreeStore(str, str, str, int)
-		self.treeview = gtk.TreeView(self.model)
-		self.treeview.set_rules_hint(True)
-		self.treeview.set_search_column(0)
-		self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
-		self.treeview.connect("row-activated", self._treeview_row_activated)
-		scrollwin.add(self.treeview)
-		self.treeview.show()
-
-		cell = gtk.CellRendererText()
-		cell.set_property("width-chars", 10)
-		cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-		column = gtk.TreeViewColumn("Commit")
-		column.set_resizable(True)
-		column.pack_start(cell, expand=True)
-		column.add_attribute(cell, "text", 0)
-		self.treeview.append_column(column)
-
-		cell = gtk.CellRendererText()
-		cell.set_property("width-chars", 20)
-		cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-		column = gtk.TreeViewColumn("File Name")
-		column.set_resizable(True)
-		column.pack_start(cell, expand=True)
-		column.add_attribute(cell, "text", 1)
-		self.treeview.append_column(column)
-
-		cell = gtk.CellRendererText()
-		cell.set_property("width-chars", 20)
-		cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-		column = gtk.TreeViewColumn("Data")
-		column.set_resizable(True)
-		column.pack_start(cell, expand=True)
-		column.add_attribute(cell, "text", 2)
-		self.treeview.append_column(column)
-
-		# The commit message window
-		scrollwin = gtk.ScrolledWindow()
-		scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		scrollwin.set_shadow_type(gtk.SHADOW_IN)
-		vpan.pack2(scrollwin, True, True);
-		scrollwin.show()
-
-		commit_text = gtk.TextView()
-		self.commit_buffer = gtk.TextBuffer()
-		commit_text.set_buffer(self.commit_buffer)
-		scrollwin.add(commit_text)
-		commit_text.show()
-
-		self.window.show()
-
-		self.add_file_data(filename, commit_sha1, line_num)
-
-		fp = os.popen("git blame --incremental -C -C -- " + filename + " " + commit_sha1)
-		flags = fcntl.fcntl(fp.fileno(), fcntl.F_GETFL)
-		fcntl.fcntl(fp.fileno(), fcntl.F_SETFL, flags | os.O_NONBLOCK)
-		self.io_watch_tag = gobject.io_add_watch(fp, gobject.IO_IN, self.data_ready)
-
-
-class DiffWindow(object):
-	"""Diff window.
-	This object represents and manages a single window containing the
-	differences between two revisions on a branch.
-	"""
-
-	def __init__(self):
-		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-		self.window.set_border_width(0)
-		self.window.set_title("Git repository browser diff window")
-
-		# Use two thirds of the screen by default
-		screen = self.window.get_screen()
-		monitor = screen.get_monitor_geometry(0)
-		width = int(monitor.width * 0.66)
-		height = int(monitor.height * 0.66)
-		self.window.set_default_size(width, height)
-
-
-		self.construct()
-
-	def construct(self):
-		"""Construct the window contents."""
-		vbox = gtk.VBox()
-		self.window.add(vbox)
-		vbox.show()
-
-		menu_bar = gtk.MenuBar()
-		save_menu = gtk.ImageMenuItem(gtk.STOCK_SAVE)
-		save_menu.connect("activate", self.save_menu_response, "save")
-		save_menu.show()
-		menu_bar.append(save_menu)
-		vbox.pack_start(menu_bar, expand=False, fill=True)
-		menu_bar.show()
-
-		hpan = gtk.HPaned()
-
-		scrollwin = gtk.ScrolledWindow()
-		scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		scrollwin.set_shadow_type(gtk.SHADOW_IN)
-		hpan.pack1(scrollwin, True, True)
-		scrollwin.show()
-
-		(self.buffer, sourceview) = get_source_buffer_and_view()
-
-		sourceview.set_editable(False)
-		sourceview.modify_font(pango.FontDescription("Monospace"))
-		scrollwin.add(sourceview)
-		sourceview.show()
-
-		# The file hierarchy: a scrollable treeview
-		scrollwin = gtk.ScrolledWindow()
-		scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		scrollwin.set_shadow_type(gtk.SHADOW_IN)
-		scrollwin.set_size_request(20, -1)
-		hpan.pack2(scrollwin, True, True)
-		scrollwin.show()
-
-		self.model = gtk.TreeStore(str, str, str)
-		self.treeview = gtk.TreeView(self.model)
-		self.treeview.set_search_column(1)
-		self.treeview.connect("cursor-changed", self._treeview_clicked)
-		scrollwin.add(self.treeview)
-		self.treeview.show()
-
-		cell = gtk.CellRendererText()
-		cell.set_property("width-chars", 20)
-		column = gtk.TreeViewColumn("Select to annotate")
-		column.pack_start(cell, expand=True)
-		column.add_attribute(cell, "text", 0)
-		self.treeview.append_column(column)
-
-		vbox.pack_start(hpan, expand=True, fill=True)
-		hpan.show()
-
-	def _treeview_clicked(self, *args):
-		"""Callback for when the treeview cursor changes."""
-		(path, col) = self.treeview.get_cursor()
-		specific_file = self.model[path][1]
-		commit_sha1 =  self.model[path][2]
-		if specific_file ==  None :
-			return
-		elif specific_file ==  "" :
-			specific_file =  None
-
-		window = AnnotateWindow();
-		window.annotate(specific_file, commit_sha1, 1)
-
-
-	def commit_files(self, commit_sha1, parent_sha1):
-		self.model.clear()
-		add  = self.model.append(None, [ "Added", None, None])
-		dele = self.model.append(None, [ "Deleted", None, None])
-		mod  = self.model.append(None, [ "Modified", None, None])
-		diff_tree = re.compile('^(:.{6}) (.{6}) (.{40}) (.{40}) (A|D|M)\s(.+)$')
-		fp = os.popen("git diff-tree -r --no-commit-id " + parent_sha1 + " " + commit_sha1)
-		while 1:
-			line = string.strip(fp.readline())
-			if line == '':
-				break
-			m = diff_tree.match(line)
-			if not m:
-				continue
-
-			attr = m.group(5)
-			filename = m.group(6)
-			if attr == "A":
-				self.model.append(add,  [filename, filename, commit_sha1])
-			elif attr == "D":
-				self.model.append(dele, [filename, filename, commit_sha1])
-			elif attr == "M":
-				self.model.append(mod,  [filename, filename, commit_sha1])
-		fp.close()
-
-		self.treeview.expand_all()
-
-	def set_diff(self, commit_sha1, parent_sha1, encoding):
-		"""Set the differences showed by this window.
-		Compares the two trees and populates the window with the
-		differences.
-		"""
-		# Diff with the first commit or the last commit shows nothing
-		if (commit_sha1 == 0 or parent_sha1 == 0 ):
-			return
-
-		fp = os.popen("git diff-tree -p " + parent_sha1 + " " + commit_sha1)
-		self.buffer.set_text(unicode(fp.read(), encoding).encode('utf-8'))
-		fp.close()
-		self.commit_files(commit_sha1, parent_sha1)
-		self.window.show()
-
-	def save_menu_response(self, widget, string):
-		dialog = gtk.FileChooserDialog("Save..", None, gtk.FILE_CHOOSER_ACTION_SAVE,
-				(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
-					gtk.STOCK_SAVE, gtk.RESPONSE_OK))
-		dialog.set_default_response(gtk.RESPONSE_OK)
-		response = dialog.run()
-		if response == gtk.RESPONSE_OK:
-			patch_buffer = self.buffer.get_text(self.buffer.get_start_iter(),
-					self.buffer.get_end_iter())
-			fp = open(dialog.get_filename(), "w")
-			fp.write(patch_buffer)
-			fp.close()
-		dialog.destroy()
-
-class GitView(object):
-	""" This is the main class
-	"""
-	version = "0.9"
-
-	def __init__(self, with_diff=0):
-		self.with_diff = with_diff
-		self.window =	gtk.Window(gtk.WINDOW_TOPLEVEL)
-		self.window.set_border_width(0)
-		self.window.set_title("Git repository browser")
-
-		self.get_encoding()
-		self.get_bt_sha1()
-
-		# Use three-quarters of the screen by default
-		screen = self.window.get_screen()
-		monitor = screen.get_monitor_geometry(0)
-		width = int(monitor.width * 0.75)
-		height = int(monitor.height * 0.75)
-		self.window.set_default_size(width, height)
-
-		# FIXME AndyFitz!
-		icon = self.window.render_icon(gtk.STOCK_INDEX, gtk.ICON_SIZE_BUTTON)
-		self.window.set_icon(icon)
-
-		self.accel_group = gtk.AccelGroup()
-		self.window.add_accel_group(self.accel_group)
-		self.accel_group.connect_group(0xffc2, 0, gtk.ACCEL_LOCKED, self.refresh);
-		self.accel_group.connect_group(0xffc1, 0, gtk.ACCEL_LOCKED, self.maximize);
-		self.accel_group.connect_group(0xffc8, 0, gtk.ACCEL_LOCKED, self.fullscreen);
-		self.accel_group.connect_group(0xffc9, 0, gtk.ACCEL_LOCKED, self.unfullscreen);
-
-		self.window.add(self.construct())
-
-	def refresh(self, widget, event=None, *arguments, **keywords):
-		self.get_encoding()
-		self.get_bt_sha1()
-		Commit.children_sha1 = {}
-		self.set_branch(sys.argv[without_diff:])
-		self.window.show()
-		return True
-
-	def maximize(self, widget, event=None, *arguments, **keywords):
-		self.window.maximize()
-		return True
-
-	def fullscreen(self, widget, event=None, *arguments, **keywords):
-		self.window.fullscreen()
-		return True
-
-	def unfullscreen(self, widget, event=None, *arguments, **keywords):
-		self.window.unfullscreen()
-		return True
-
-	def get_bt_sha1(self):
-		""" Update the bt_sha1 dictionary with the
-		respective sha1 details """
-
-		self.bt_sha1 = { }
-		ls_remote = re.compile('^(.{40})\trefs/([^^]+)(?:\\^(..))?$');
-		fp = os.popen('git ls-remote "${GIT_DIR-.git}"')
-		while 1:
-			line = string.strip(fp.readline())
-			if line == '':
-				break
-			m = ls_remote.match(line)
-			if not m:
-				continue
-			(sha1, name) = (m.group(1), m.group(2))
-			if not self.bt_sha1.has_key(sha1):
-				self.bt_sha1[sha1] = []
-			self.bt_sha1[sha1].append(name)
-		fp.close()
-
-	def get_encoding(self):
-		fp = os.popen("git config --get i18n.commitencoding")
-		self.encoding=string.strip(fp.readline())
-		fp.close()
-		if (self.encoding == ""):
-			self.encoding = "utf-8"
-
-
-	def construct(self):
-		"""Construct the window contents."""
-		vbox = gtk.VBox()
-		paned = gtk.VPaned()
-		paned.pack1(self.construct_top(), resize=False, shrink=True)
-		paned.pack2(self.construct_bottom(), resize=False, shrink=True)
-		menu_bar = gtk.MenuBar()
-		menu_bar.set_pack_direction(gtk.PACK_DIRECTION_RTL)
-		help_menu = gtk.MenuItem("Help")
-		menu = gtk.Menu()
-		about_menu = gtk.MenuItem("About")
-		menu.append(about_menu)
-		about_menu.connect("activate", self.about_menu_response, "about")
-		about_menu.show()
-		help_menu.set_submenu(menu)
-		help_menu.show()
-		menu_bar.append(help_menu)
-		menu_bar.show()
-		vbox.pack_start(menu_bar, expand=False, fill=True)
-		vbox.pack_start(paned, expand=True, fill=True)
-		paned.show()
-		vbox.show()
-		return vbox
-
-
-	def construct_top(self):
-		"""Construct the top-half of the window."""
-		vbox = gtk.VBox(spacing=6)
-		vbox.set_border_width(12)
-		vbox.show()
-
-
-		scrollwin = gtk.ScrolledWindow()
-		scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		scrollwin.set_shadow_type(gtk.SHADOW_IN)
-		vbox.pack_start(scrollwin, expand=True, fill=True)
-		scrollwin.show()
-
-		self.treeview = gtk.TreeView()
-		self.treeview.set_rules_hint(True)
-		self.treeview.set_search_column(4)
-		self.treeview.connect("cursor-changed", self._treeview_cursor_cb)
-		scrollwin.add(self.treeview)
-		self.treeview.show()
-
-		cell = CellRendererGraph()
-		column = gtk.TreeViewColumn()
-		column.set_resizable(True)
-		column.pack_start(cell, expand=True)
-		column.add_attribute(cell, "node", 1)
-		column.add_attribute(cell, "in-lines", 2)
-		column.add_attribute(cell, "out-lines", 3)
-		self.treeview.append_column(column)
-
-		cell = gtk.CellRendererText()
-		cell.set_property("width-chars", 65)
-		cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-		column = gtk.TreeViewColumn("Message")
-		column.set_resizable(True)
-		column.pack_start(cell, expand=True)
-		column.add_attribute(cell, "text", 4)
-		self.treeview.append_column(column)
-
-		cell = gtk.CellRendererText()
-		cell.set_property("width-chars", 40)
-		cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-		column = gtk.TreeViewColumn("Author")
-		column.set_resizable(True)
-		column.pack_start(cell, expand=True)
-		column.add_attribute(cell, "text", 5)
-		self.treeview.append_column(column)
-
-		cell = gtk.CellRendererText()
-		cell.set_property("ellipsize", pango.ELLIPSIZE_END)
-		column = gtk.TreeViewColumn("Date")
-		column.set_resizable(True)
-		column.pack_start(cell, expand=True)
-		column.add_attribute(cell, "text", 6)
-		self.treeview.append_column(column)
-
-		return vbox
-
-	def about_menu_response(self, widget, string):
-		dialog = gtk.AboutDialog()
-		dialog.set_name("Gitview")
-		dialog.set_version(GitView.version)
-		dialog.set_authors(["Aneesh Kumar K.V <aneesh.kumar@gmail.com>"])
-		dialog.set_website("http://www.kernel.org/pub/software/scm/git/")
-		dialog.set_copyright("Use and distribute under the terms of the GNU General Public License")
-		dialog.set_wrap_license(True)
-		dialog.run()
-		dialog.destroy()
-
-
-	def construct_bottom(self):
-		"""Construct the bottom half of the window."""
-		vbox = gtk.VBox(False, spacing=6)
-		vbox.set_border_width(12)
-		(width, height) = self.window.get_size()
-		vbox.set_size_request(width, int(height / 2.5))
-		vbox.show()
-
-		self.table = gtk.Table(rows=4, columns=4)
-		self.table.set_row_spacings(6)
-		self.table.set_col_spacings(6)
-		vbox.pack_start(self.table, expand=False, fill=True)
-		self.table.show()
-
-		align = gtk.Alignment(0.0, 0.5)
-		label = gtk.Label()
-		label.set_markup("<b>Revision:</b>")
-		align.add(label)
-		self.table.attach(align, 0, 1, 0, 1, gtk.FILL, gtk.FILL)
-		label.show()
-		align.show()
-
-		align = gtk.Alignment(0.0, 0.5)
-		self.revid_label = gtk.Label()
-		self.revid_label.set_selectable(True)
-		align.add(self.revid_label)
-		self.table.attach(align, 1, 2, 0, 1, gtk.EXPAND | gtk.FILL, gtk.FILL)
-		self.revid_label.show()
-		align.show()
-
-		align = gtk.Alignment(0.0, 0.5)
-		label = gtk.Label()
-		label.set_markup("<b>Committer:</b>")
-		align.add(label)
-		self.table.attach(align, 0, 1, 1, 2, gtk.FILL, gtk.FILL)
-		label.show()
-		align.show()
-
-		align = gtk.Alignment(0.0, 0.5)
-		self.committer_label = gtk.Label()
-		self.committer_label.set_selectable(True)
-		align.add(self.committer_label)
-		self.table.attach(align, 1, 2, 1, 2, gtk.EXPAND | gtk.FILL, gtk.FILL)
-		self.committer_label.show()
-		align.show()
-
-		align = gtk.Alignment(0.0, 0.5)
-		label = gtk.Label()
-		label.set_markup("<b>Timestamp:</b>")
-		align.add(label)
-		self.table.attach(align, 0, 1, 2, 3, gtk.FILL, gtk.FILL)
-		label.show()
-		align.show()
-
-		align = gtk.Alignment(0.0, 0.5)
-		self.timestamp_label = gtk.Label()
-		self.timestamp_label.set_selectable(True)
-		align.add(self.timestamp_label)
-		self.table.attach(align, 1, 2, 2, 3, gtk.EXPAND | gtk.FILL, gtk.FILL)
-		self.timestamp_label.show()
-		align.show()
-
-		align = gtk.Alignment(0.0, 0.5)
-		label = gtk.Label()
-		label.set_markup("<b>Parents:</b>")
-		align.add(label)
-		self.table.attach(align, 0, 1, 3, 4, gtk.FILL, gtk.FILL)
-		label.show()
-		align.show()
-		self.parents_widgets = []
-
-		align = gtk.Alignment(0.0, 0.5)
-		label = gtk.Label()
-		label.set_markup("<b>Children:</b>")
-		align.add(label)
-		self.table.attach(align, 2, 3, 3, 4, gtk.FILL, gtk.FILL)
-		label.show()
-		align.show()
-		self.children_widgets = []
-
-		scrollwin = gtk.ScrolledWindow()
-		scrollwin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-		scrollwin.set_shadow_type(gtk.SHADOW_IN)
-		vbox.pack_start(scrollwin, expand=True, fill=True)
-		scrollwin.show()
-
-		(self.message_buffer, sourceview) = get_source_buffer_and_view()
-
-		sourceview.set_editable(False)
-		sourceview.modify_font(pango.FontDescription("Monospace"))
-		scrollwin.add(sourceview)
-		sourceview.show()
-
-		return vbox
-
-	def _treeview_cursor_cb(self, *args):
-		"""Callback for when the treeview cursor changes."""
-		(path, col) = self.treeview.get_cursor()
-		commit = self.model[path][0]
-
-		if commit.committer is not None:
-			committer = commit.committer
-			timestamp = commit.commit_date
-			message   =  commit.get_message(self.with_diff)
-			revid_label = commit.commit_sha1
-		else:
-			committer = ""
-			timestamp = ""
-			message = ""
-			revid_label = ""
-
-		self.revid_label.set_text(revid_label)
-		self.committer_label.set_text(committer)
-		self.timestamp_label.set_text(timestamp)
-		self.message_buffer.set_text(unicode(message, self.encoding).encode('utf-8'))
-
-		for widget in self.parents_widgets:
-			self.table.remove(widget)
-
-		self.parents_widgets = []
-		self.table.resize(4 + len(commit.parent_sha1) - 1, 4)
-		for idx, parent_id in enumerate(commit.parent_sha1):
-			self.table.set_row_spacing(idx + 3, 0)
-
-			align = gtk.Alignment(0.0, 0.0)
-			self.parents_widgets.append(align)
-			self.table.attach(align, 1, 2, idx + 3, idx + 4,
-					gtk.EXPAND | gtk.FILL, gtk.FILL)
-			align.show()
-
-			hbox = gtk.HBox(False, 0)
-			align.add(hbox)
-			hbox.show()
-
-			label = gtk.Label(parent_id)
-			label.set_selectable(True)
-			hbox.pack_start(label, expand=False, fill=True)
-			label.show()
-
-			image = gtk.Image()
-			image.set_from_stock(gtk.STOCK_JUMP_TO, gtk.ICON_SIZE_MENU)
-			image.show()
-
-			button = gtk.Button()
-			button.add(image)
-			button.set_relief(gtk.RELIEF_NONE)
-			button.connect("clicked", self._go_clicked_cb, parent_id)
-			hbox.pack_start(button, expand=False, fill=True)
-			button.show()
-
-			image = gtk.Image()
-			image.set_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU)
-			image.show()
-
-			button = gtk.Button()
-			button.add(image)
-			button.set_relief(gtk.RELIEF_NONE)
-			button.set_sensitive(True)
-			button.connect("clicked", self._show_clicked_cb,
-					commit.commit_sha1, parent_id, self.encoding)
-			hbox.pack_start(button, expand=False, fill=True)
-			button.show()
-
-		# Populate with child details
-		for widget in self.children_widgets:
-			self.table.remove(widget)
-
-		self.children_widgets = []
-		try:
-			child_sha1 = Commit.children_sha1[commit.commit_sha1]
-		except KeyError:
-			# We don't have child
-			child_sha1 = [ 0 ]
-
-		if ( len(child_sha1) > len(commit.parent_sha1)):
-			self.table.resize(4 + len(child_sha1) - 1, 4)
-
-		for idx, child_id in enumerate(child_sha1):
-			self.table.set_row_spacing(idx + 3, 0)
-
-			align = gtk.Alignment(0.0, 0.0)
-			self.children_widgets.append(align)
-			self.table.attach(align, 3, 4, idx + 3, idx + 4,
-					gtk.EXPAND | gtk.FILL, gtk.FILL)
-			align.show()
-
-			hbox = gtk.HBox(False, 0)
-			align.add(hbox)
-			hbox.show()
-
-			label = gtk.Label(child_id)
-			label.set_selectable(True)
-			hbox.pack_start(label, expand=False, fill=True)
-			label.show()
-
-			image = gtk.Image()
-			image.set_from_stock(gtk.STOCK_JUMP_TO, gtk.ICON_SIZE_MENU)
-			image.show()
-
-			button = gtk.Button()
-			button.add(image)
-			button.set_relief(gtk.RELIEF_NONE)
-			button.connect("clicked", self._go_clicked_cb, child_id)
-			hbox.pack_start(button, expand=False, fill=True)
-			button.show()
-
-			image = gtk.Image()
-			image.set_from_stock(gtk.STOCK_FIND, gtk.ICON_SIZE_MENU)
-			image.show()
-
-			button = gtk.Button()
-			button.add(image)
-			button.set_relief(gtk.RELIEF_NONE)
-			button.set_sensitive(True)
-			button.connect("clicked", self._show_clicked_cb,
-					child_id, commit.commit_sha1, self.encoding)
-			hbox.pack_start(button, expand=False, fill=True)
-			button.show()
-
-	def _destroy_cb(self, widget):
-		"""Callback for when a window we manage is destroyed."""
-		self.quit()
-
-
-	def quit(self):
-		"""Stop the GTK+ main loop."""
-		gtk.main_quit()
-
-	def run(self, args):
-		self.set_branch(args)
-		self.window.connect("destroy", self._destroy_cb)
-		self.window.show()
-		gtk.main()
-
-	def set_branch(self, args):
-		"""Fill in different windows with info from the reposiroty"""
-		fp = os.popen("git rev-parse --sq --default HEAD " + list_to_string(args, 1))
-		git_rev_list_cmd = fp.read()
-		fp.close()
-		fp = os.popen("git rev-list  --header --topo-order --parents " + git_rev_list_cmd)
-		self.update_window(fp)
-
-	def update_window(self, fp):
-		commit_lines = []
-
-		self.model = gtk.ListStore(gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT,
-				gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, str, str, str)
-
-		# used for cursor positioning
-		self.index = {}
-
-		self.colours = {}
-		self.nodepos = {}
-		self.incomplete_line = {}
-		self.commits = []
-
-		index = 0
-		last_colour = 0
-		last_nodepos = -1
-		out_line = []
-		input_line = fp.readline()
-		while (input_line != ""):
-			# The commit header ends with '\0'
-			# This NULL is immediately followed by the sha1 of the
-			# next commit
-			if (input_line[0] != '\0'):
-				commit_lines.append(input_line)
-				input_line = fp.readline()
-				continue;
-
-			commit = Commit(commit_lines)
-			if (commit != None ):
-				self.commits.append(commit)
-
-			# Skip the '\0
-			commit_lines = []
-			commit_lines.append(input_line[1:])
-			input_line = fp.readline()
-
-		fp.close()
-
-		for commit in self.commits:
-			(out_line, last_colour, last_nodepos) = self.draw_graph(commit,
-										index, out_line,
-										last_colour,
-										last_nodepos)
-			self.index[commit.commit_sha1] = index
-			index += 1
-
-		self.treeview.set_model(self.model)
-		self.treeview.show()
-
-	def draw_graph(self, commit, index, out_line, last_colour, last_nodepos):
-		in_line=[]
-
-		#   |   -> outline
-		#   X
-		#   |\  <- inline
-
-		# Reset nodepostion
-		if (last_nodepos > 5):
-			last_nodepos = -1
-
-		# Add the incomplete lines of the last cell in this
-		try:
-			colour = self.colours[commit.commit_sha1]
-		except KeyError:
-			self.colours[commit.commit_sha1] = last_colour+1
-			last_colour = self.colours[commit.commit_sha1]
-			colour =   self.colours[commit.commit_sha1]
-
-		try:
-			node_pos = self.nodepos[commit.commit_sha1]
-		except KeyError:
-			self.nodepos[commit.commit_sha1] = last_nodepos+1
-			last_nodepos = self.nodepos[commit.commit_sha1]
-			node_pos =  self.nodepos[commit.commit_sha1]
-
-		#The first parent always continue on the same line
-		try:
-			# check we already have the value
-			tmp_node_pos = self.nodepos[commit.parent_sha1[0]]
-		except KeyError:
-			self.colours[commit.parent_sha1[0]] = colour
-			self.nodepos[commit.parent_sha1[0]] = node_pos
-
-		for sha1 in self.incomplete_line.keys():
-			if (sha1 != commit.commit_sha1):
-				self.draw_incomplete_line(sha1, node_pos,
-						out_line, in_line, index)
-			else:
-				del self.incomplete_line[sha1]
-
-
-		for parent_id in commit.parent_sha1:
-			try:
-				tmp_node_pos = self.nodepos[parent_id]
-			except KeyError:
-				self.colours[parent_id] = last_colour+1
-				last_colour = self.colours[parent_id]
-				self.nodepos[parent_id] = last_nodepos+1
-				last_nodepos = self.nodepos[parent_id]
-
-			in_line.append((node_pos, self.nodepos[parent_id],
-						self.colours[parent_id]))
-			self.add_incomplete_line(parent_id)
-
-		try:
-			branch_tag = self.bt_sha1[commit.commit_sha1]
-		except KeyError:
-			branch_tag = [ ]
-
-
-		node = (node_pos, colour, branch_tag)
-
-		self.model.append([commit, node, out_line, in_line,
-				commit.message, commit.author, commit.date])
-
-		return (in_line, last_colour, last_nodepos)
-
-	def add_incomplete_line(self, sha1):
-		try:
-			self.incomplete_line[sha1].append(self.nodepos[sha1])
-		except KeyError:
-			self.incomplete_line[sha1] = [self.nodepos[sha1]]
-
-	def draw_incomplete_line(self, sha1, node_pos, out_line, in_line, index):
-		for idx, pos in enumerate(self.incomplete_line[sha1]):
-			if(pos == node_pos):
-				#remove the straight line and add a slash
-				if ((pos, pos, self.colours[sha1]) in out_line):
-					out_line.remove((pos, pos, self.colours[sha1]))
-				out_line.append((pos, pos+0.5, self.colours[sha1]))
-				self.incomplete_line[sha1][idx] = pos = pos+0.5
-			try:
-				next_commit = self.commits[index+1]
-				if (next_commit.commit_sha1 == sha1 and pos != int(pos)):
-				# join the line back to the node point
-				# This need to be done only if we modified it
-					in_line.append((pos, pos-0.5, self.colours[sha1]))
-					continue;
-			except IndexError:
-				pass
-			in_line.append((pos, pos, self.colours[sha1]))
-
-
-	def _go_clicked_cb(self, widget, revid):
-		"""Callback for when the go button for a parent is clicked."""
-		try:
-			self.treeview.set_cursor(self.index[revid])
-		except KeyError:
-			dialog = gtk.MessageDialog(parent=None, flags=0,
-					type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_CLOSE,
-					message_format=None)
-			dialog.set_markup("Revision <b>%s</b> not present in the list" % revid)
-			# revid == 0 is the parent of the first commit
-			if (revid != 0 ):
-				dialog.format_secondary_text("Try running gitview without any options")
-			dialog.run()
-			dialog.destroy()
-
-		self.treeview.grab_focus()
-
-	def _show_clicked_cb(self, widget,  commit_sha1, parent_sha1, encoding):
-		"""Callback for when the show button for a parent is clicked."""
-		window = DiffWindow()
-		window.set_diff(commit_sha1, parent_sha1, encoding)
-		self.treeview.grab_focus()
-
-without_diff = 0
-if __name__ == "__main__":
-
-	if (len(sys.argv) > 1 ):
-		if (sys.argv[1] == "--without-diff"):
-			without_diff = 1
-
-	view = GitView( without_diff != 1)
-	view.run(sys.argv[without_diff:])
diff --git a/contrib/gitview/gitview.txt b/contrib/gitview/gitview.txt
deleted file mode 100644
index 9e12f97..0000000
--- a/contrib/gitview/gitview.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-gitview(1)
-==========
-
-NAME
-----
-gitview - A GTK based repository browser for git
-
-SYNOPSIS
---------
-[verse]
-'gitview' [options] [args]
-
-DESCRIPTION
----------
-
-Dependencies:
-
-* Python 2.4
-* PyGTK 2.8 or later
-* PyCairo 1.0 or later
-
-OPTIONS
--------
---without-diff::
-
-	If the user doesn't want to list the commit diffs in the main window.
-	This may speed up the repository browsing.
-
-<args>::
-
-	All the valid option for gitlink:git-rev-list[1].
-
-Key Bindings
-------------
-F4::
-	To maximize the window
-
-F5::
-	To reread references.
-
-F11::
-	Full screen
-
-F12::
-	Leave full screen
-
-EXAMPLES
---------
-
-gitview v2.6.12.. include/scsi drivers/scsi::
-
-	Show as the changes since version v2.6.12 that changed any file in the
-	include/scsi or drivers/scsi subdirectories
-
-gitview --since=2.weeks.ago::
-
-	Show the changes during the last two weeks
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 10/25] contrib: reomve 'thunderbird-patch-inline'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (7 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 09/25] contrib: remove 'gitview' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 11/25] contrib: remove 'workdir' Felipe Contreras
                   ` (16 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity, no tests.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/thunderbird-patch-inline/README  | 20 ------------
 contrib/thunderbird-patch-inline/appp.sh | 55 --------------------------------
 2 files changed, 75 deletions(-)
 delete mode 100644 contrib/thunderbird-patch-inline/README
 delete mode 100755 contrib/thunderbird-patch-inline/appp.sh

diff --git a/contrib/thunderbird-patch-inline/README b/contrib/thunderbird-patch-inline/README
deleted file mode 100644
index 000147b..0000000
--- a/contrib/thunderbird-patch-inline/README
+++ /dev/null
@@ -1,20 +0,0 @@
-appp.sh is a script that is supposed to be used together with ExternalEditor
-for Mozilla Thunderbird. It will let you include patches inline in e-mails
-in an easy way.
-
-Usage:
-- Generate the patch with git format-patch.
-- Start writing a new e-mail in Thunderbird.
-- Press the external editor button (or Ctrl-E) to run appp.sh
-- Select the previously generated patch file.
-- Finish editing the e-mail.
-
-Any text that is entered into the message editor before appp.sh is called
-will be moved to the section between the --- and the diffstat.
-
-All S-O-B:s and Cc:s in the patch will be added to the CC list.
-
-To set it up, just install External Editor and tell it to use appp.sh as the
-editor.
-
-Zenity is a required dependency.
diff --git a/contrib/thunderbird-patch-inline/appp.sh b/contrib/thunderbird-patch-inline/appp.sh
deleted file mode 100755
index 8dc73ec..0000000
--- a/contrib/thunderbird-patch-inline/appp.sh
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/bin/sh
-# Copyright 2008 Lukas Sandström <luksan@gmail.com>
-#
-# AppendPatch - A script to be used together with ExternalEditor
-# for Mozilla Thunderbird to properly include patches inline in e-mails.
-
-# ExternalEditor can be downloaded at http://globs.org/articles.php?lng=en&pg=2
-
-CONFFILE=~/.appprc
-
-SEP="-=-=-=-=-=-=-=-=-=# Don't remove this line #=-=-=-=-=-=-=-=-=-"
-if [ -e "$CONFFILE" ] ; then
-	LAST_DIR=$(grep -m 1 "^LAST_DIR=" "${CONFFILE}"|sed -e 's/^LAST_DIR=//')
-	cd "${LAST_DIR}"
-else
-	cd > /dev/null
-fi
-
-PATCH=$(zenity --file-selection)
-
-if [ "$?" != "0" ] ; then
-	#zenity --error --text "No patchfile given."
-	exit 1
-fi
-
-cd - > /dev/null
-
-SUBJECT=$(sed -n -e '/^Subject: /p' "${PATCH}")
-HEADERS=$(sed -e '/^'"${SEP}"'$/,$d' $1)
-BODY=$(sed -e "1,/${SEP}/d" $1)
-CMT_MSG=$(sed -e '1,/^$/d' -e '/^---$/,$d' "${PATCH}")
-DIFF=$(sed -e '1,/^---$/d' "${PATCH}")
-
-CCS=`echo -e "$CMT_MSG\n$HEADERS" | sed -n -e 's/^Cc: \(.*\)$/\1,/gp' \
-	-e 's/^Signed-off-by: \(.*\)/\1,/gp'`
-
-echo "$SUBJECT" > $1
-echo "Cc: $CCS" >> $1
-echo "$HEADERS" | sed -e '/^Subject: /d' -e '/^Cc: /d' >> $1
-echo "$SEP" >> $1
-
-echo "$CMT_MSG" >> $1
-echo "---" >> $1
-if [ "x${BODY}x" != "xx" ] ; then
-	echo >> $1
-	echo "$BODY" >> $1
-	echo >> $1
-fi
-echo "$DIFF" >> $1
-
-LAST_DIR=$(dirname "${PATCH}")
-
-grep -v "^LAST_DIR=" "${CONFFILE}" > "${CONFFILE}_"
-echo "LAST_DIR=${LAST_DIR}" >> "${CONFFILE}_"
-mv "${CONFFILE}_" "${CONFFILE}"
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 11/25] contrib: remove 'workdir'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (8 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 10/25] contrib: reomve 'thunderbird-patch-inline' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 12/25] contrib: remove 'vim' Felipe Contreras
                   ` (15 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity since 2010, no documentation, no tests.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/workdir/git-new-workdir | 82 -----------------------------------------
 1 file changed, 82 deletions(-)
 delete mode 100755 contrib/workdir/git-new-workdir

diff --git a/contrib/workdir/git-new-workdir b/contrib/workdir/git-new-workdir
deleted file mode 100755
index 75e8b25..0000000
--- a/contrib/workdir/git-new-workdir
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/bin/sh
-
-usage () {
-	echo "usage:" $@
-	exit 127
-}
-
-die () {
-	echo $@
-	exit 128
-}
-
-if test $# -lt 2 || test $# -gt 3
-then
-	usage "$0 <repository> <new_workdir> [<branch>]"
-fi
-
-orig_git=$1
-new_workdir=$2
-branch=$3
-
-# want to make sure that what is pointed to has a .git directory ...
-git_dir=$(cd "$orig_git" 2>/dev/null &&
-  git rev-parse --git-dir 2>/dev/null) ||
-  die "Not a git repository: \"$orig_git\""
-
-case "$git_dir" in
-.git)
-	git_dir="$orig_git/.git"
-	;;
-.)
-	git_dir=$orig_git
-	;;
-esac
-
-# don't link to a configured bare repository
-isbare=$(git --git-dir="$git_dir" config --bool --get core.bare)
-if test ztrue = z$isbare
-then
-	die "\"$git_dir\" has core.bare set to true," \
-		" remove from \"$git_dir/config\" to use $0"
-fi
-
-# don't link to a workdir
-if test -h "$git_dir/config"
-then
-	die "\"$orig_git\" is a working directory only, please specify" \
-		"a complete repository."
-fi
-
-# don't recreate a workdir over an existing repository
-if test -e "$new_workdir"
-then
-	die "destination directory '$new_workdir' already exists."
-fi
-
-# make sure the links use full paths
-git_dir=$(cd "$git_dir"; pwd)
-
-# create the workdir
-mkdir -p "$new_workdir/.git" || die "unable to create \"$new_workdir\"!"
-
-# create the links to the original repo.  explicitly exclude index, HEAD and
-# logs/HEAD from the list since they are purely related to the current working
-# directory, and should not be shared.
-for x in config refs logs/refs objects info hooks packed-refs remotes rr-cache svn
-do
-	case $x in
-	*/*)
-		mkdir -p "$(dirname "$new_workdir/.git/$x")"
-		;;
-	esac
-	ln -s "$git_dir/$x" "$new_workdir/.git/$x"
-done
-
-# now setup the workdir
-cd "$new_workdir"
-# copy the HEAD from the original repository as a default branch
-cp "$git_dir/HEAD" .git/HEAD
-# checkout the branch (either the same as HEAD from the original repository, or
-# the one that was asked for)
-git checkout -f $branch
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 12/25] contrib: remove 'vim'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (9 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 11/25] contrib: remove 'workdir' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  2:02   ` Jeff King
  2014-05-09  0:58 ` [PATCH v1 13/25] contrib: remove 'svn-fe' Felipe Contreras
                   ` (14 subsequent siblings)
  25 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

There's nothing there.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/vim/README | 22 ----------------------
 1 file changed, 22 deletions(-)
 delete mode 100644 contrib/vim/README

diff --git a/contrib/vim/README b/contrib/vim/README
deleted file mode 100644
index 8f16d06..0000000
--- a/contrib/vim/README
+++ /dev/null
@@ -1,22 +0,0 @@
-Syntax highlighting for git commit messages, config files, etc. is
-included with the vim distribution as of vim 7.2, and should work
-automatically.
-
-If you have an older version of vim, you can get the latest syntax
-files from the vim project:
-
-  http://ftp.vim.org/pub/vim/runtime/syntax/git.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitcommit.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitconfig.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitrebase.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitsendemail.vim
-
-These files are also available via FTP at the same location.
-
-To install:
-
-  1. Copy these files to vim's syntax directory $HOME/.vim/syntax
-  2. To auto-detect the editing of various git-related filetypes:
-
-	$ curl http://ftp.vim.org/pub/vim/runtime/filetype.vim |
-		sed -ne '/^" Git$/, /^$/ p' >>$HOME/.vim/filetype.vim
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 13/25] contrib: remove 'svn-fe'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (10 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 12/25] contrib: remove 'vim' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 14/25] contrib: remove 'rerere-train' Felipe Contreras
                   ` (13 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras, Jonathan Nieder

No activity since 2012, no tests.

Cc: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/svn-fe/.gitignore      |  4 ---
 contrib/svn-fe/Makefile        | 63 -------------------------------------
 contrib/svn-fe/svn-fe.c        | 18 -----------
 contrib/svn-fe/svn-fe.txt      | 71 ------------------------------------------
 contrib/svn-fe/svnrdump_sim.py | 57 ---------------------------------
 5 files changed, 213 deletions(-)
 delete mode 100644 contrib/svn-fe/.gitignore
 delete mode 100644 contrib/svn-fe/Makefile
 delete mode 100644 contrib/svn-fe/svn-fe.c
 delete mode 100644 contrib/svn-fe/svn-fe.txt
 delete mode 100755 contrib/svn-fe/svnrdump_sim.py

diff --git a/contrib/svn-fe/.gitignore b/contrib/svn-fe/.gitignore
deleted file mode 100644
index 02a7791..0000000
--- a/contrib/svn-fe/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/*.xml
-/*.1
-/*.html
-/svn-fe
diff --git a/contrib/svn-fe/Makefile b/contrib/svn-fe/Makefile
deleted file mode 100644
index 360d8da..0000000
--- a/contrib/svn-fe/Makefile
+++ /dev/null
@@ -1,63 +0,0 @@
-all:: svn-fe$X
-
-CC = gcc
-RM = rm -f
-MV = mv
-
-CFLAGS = -g -O2 -Wall
-LDFLAGS =
-ALL_CFLAGS = $(CFLAGS)
-ALL_LDFLAGS = $(LDFLAGS)
-EXTLIBS =
-
-GIT_LIB = ../../libgit.a
-VCSSVN_LIB = ../../vcs-svn/lib.a
-LIBS = $(VCSSVN_LIB) $(GIT_LIB) $(EXTLIBS)
-
-QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir
-QUIET_SUBDIR1 =
-
-ifneq ($(findstring $(MAKEFLAGS),w),w)
-PRINT_DIR = --no-print-directory
-else # "make -w"
-NO_SUBDIR = :
-endif
-
-ifneq ($(findstring $(MAKEFLAGS),s),s)
-ifndef V
-	QUIET_CC      = @echo '   ' CC $@;
-	QUIET_LINK    = @echo '   ' LINK $@;
-	QUIET_SUBDIR0 = +@subdir=
-	QUIET_SUBDIR1 = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
-	                $(MAKE) $(PRINT_DIR) -C $$subdir
-endif
-endif
-
-svn-fe$X: svn-fe.o $(VCSSVN_LIB) $(GIT_LIB)
-	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ svn-fe.o \
-		$(ALL_LDFLAGS) $(LIBS)
-
-svn-fe.o: svn-fe.c ../../vcs-svn/svndump.h
-	$(QUIET_CC)$(CC) -I../../vcs-svn -o $*.o -c $(ALL_CFLAGS) $<
-
-svn-fe.html: svn-fe.txt
-	$(QUIET_SUBDIR0)../../Documentation $(QUIET_SUBDIR1) \
-		MAN_TXT=../contrib/svn-fe/svn-fe.txt \
-		../contrib/svn-fe/$@
-
-svn-fe.1: svn-fe.txt
-	$(QUIET_SUBDIR0)../../Documentation $(QUIET_SUBDIR1) \
-		MAN_TXT=../contrib/svn-fe/svn-fe.txt \
-		../contrib/svn-fe/$@
-	$(MV) ../../Documentation/svn-fe.1 .
-
-../../vcs-svn/lib.a: FORCE
-	$(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) vcs-svn/lib.a
-
-../../libgit.a: FORCE
-	$(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) libgit.a
-
-clean:
-	$(RM) svn-fe$X svn-fe.o svn-fe.html svn-fe.xml svn-fe.1
-
-.PHONY: all clean FORCE
diff --git a/contrib/svn-fe/svn-fe.c b/contrib/svn-fe/svn-fe.c
deleted file mode 100644
index f363505..0000000
--- a/contrib/svn-fe/svn-fe.c
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * This file is in the public domain.
- * You may freely use, modify, distribute, and relicense it.
- */
-
-#include <stdlib.h>
-#include "svndump.h"
-
-int main(int argc, char **argv)
-{
-	if (svndump_init(NULL))
-		return 1;
-	svndump_read((argc > 1) ? argv[1] : NULL, "refs/heads/master",
-			"refs/notes/svn/revs");
-	svndump_deinit();
-	svndump_reset();
-	return 0;
-}
diff --git a/contrib/svn-fe/svn-fe.txt b/contrib/svn-fe/svn-fe.txt
deleted file mode 100644
index a3425f4..0000000
--- a/contrib/svn-fe/svn-fe.txt
+++ /dev/null
@@ -1,71 +0,0 @@
-svn-fe(1)
-=========
-
-NAME
-----
-svn-fe - convert an SVN "dumpfile" to a fast-import stream
-
-SYNOPSIS
---------
-[verse]
-mkfifo backchannel &&
-svnadmin dump --deltas REPO |
-	svn-fe [url] 3<backchannel |
-	git fast-import --cat-blob-fd=3 3>backchannel
-
-DESCRIPTION
------------
-
-Converts a Subversion dumpfile into input suitable for
-git-fast-import(1) and similar importers. REPO is a path to a
-Subversion repository mirrored on the local disk. Remote Subversion
-repositories can be mirrored on local disk using the `svnsync`
-command.
-
-Note: this tool is very young.  The details of its commandline
-interface may change in backward incompatible ways.
-
-INPUT FORMAT
-------------
-Subversion's repository dump format is documented in full in
-`notes/dump-load-format.txt` from the Subversion source tree.
-Files in this format can be generated using the 'svnadmin dump' or
-'svk admin dump' command.
-
-OUTPUT FORMAT
--------------
-The fast-import format is documented by the git-fast-import(1)
-manual page.
-
-NOTES
------
-Subversion dumps do not record a separate author and committer for
-each revision, nor do they record a separate display name and email
-address for each author.  Like git-svn(1), 'svn-fe' will use the name
-
----------
-user <user@UUID>
----------
-
-as committer, where 'user' is the value of the `svn:author` property
-and 'UUID' the repository's identifier.
-
-To support incremental imports, 'svn-fe' puts a `git-svn-id` line at
-the end of each commit log message if passed a URL on the command
-line.  This line has the form `git-svn-id: URL@REVNO UUID`.
-
-The resulting repository will generally require further processing
-to put each project in its own repository and to separate the history
-of each branch.  The 'git filter-branch --subdirectory-filter' command
-may be useful for this purpose.
-
-BUGS
-----
-Empty directories and unknown properties are silently discarded.
-
-The exit status does not reflect whether an error was detected.
-
-SEE ALSO
---------
-git-svn(1), svn2git(1), svk(1), git-filter-branch(1), git-fast-import(1),
-https://svn.apache.org/repos/asf/subversion/trunk/notes/dump-load-format.txt
diff --git a/contrib/svn-fe/svnrdump_sim.py b/contrib/svn-fe/svnrdump_sim.py
deleted file mode 100755
index 4e78a1c..0000000
--- a/contrib/svn-fe/svnrdump_sim.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/python
-"""
-Simulates svnrdump by replaying an existing dump from a file, taking care
-of the specified revision range.
-To simulate incremental imports the environment variable SVNRMAX can be set
-to the highest revision that should be available.
-"""
-import sys, os
-
-if sys.hexversion < 0x02040000:
-        # The limiter is the ValueError() calls. This may be too conservative
-        sys.stderr.write("svnrdump-sim.py: requires Python 2.4 or later.\n")
-        sys.exit(1)
-
-def getrevlimit():
-        var = 'SVNRMAX'
-        if var in os.environ:
-                return os.environ[var]
-        return None
-
-def writedump(url, lower, upper):
-        if url.startswith('sim://'):
-                filename = url[6:]
-                if filename[-1] == '/': filename = filename[:-1] #remove terminating slash
-        else:
-                raise ValueError('sim:// url required')
-        f = open(filename, 'r');
-        state = 'header'
-        wroterev = False
-        while(True):
-                l = f.readline()
-                if l == '': break
-                if state == 'header' and l.startswith('Revision-number: '):
-                        state = 'prefix'
-                if state == 'prefix' and l == 'Revision-number: %s\n' % lower:
-                        state = 'selection'
-                if not upper == 'HEAD' and state == 'selection' and l == 'Revision-number: %s\n' % upper:
-                        break;
-
-                if state == 'header' or state == 'selection':
-                        if state == 'selection': wroterev = True
-                        sys.stdout.write(l)
-        return wroterev
-
-if __name__ == "__main__":
-        if not (len(sys.argv) in (3, 4, 5)):
-                print("usage: %s dump URL -rLOWER:UPPER")
-                sys.exit(1)
-        if not sys.argv[1] == 'dump': raise NotImplementedError('only "dump" is suppported.')
-        url = sys.argv[2]
-        r = ('0', 'HEAD')
-        if len(sys.argv) == 4 and sys.argv[3][0:2] == '-r':
-                r = sys.argv[3][2:].lstrip().split(':')
-        if not getrevlimit() is None: r[1] = getrevlimit()
-        if writedump(url, r[0], r[1]): ret = 0
-        else: ret = 1
-        sys.exit(ret)
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 14/25] contrib: remove 'rerere-train'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (11 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 13/25] contrib: remove 'svn-fe' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 15/25] contrib: remove 'remotes2config' Felipe Contreras
                   ` (12 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity, no nothing.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/rerere-train.sh | 52 -------------------------------------------------
 1 file changed, 52 deletions(-)
 delete mode 100755 contrib/rerere-train.sh

diff --git a/contrib/rerere-train.sh b/contrib/rerere-train.sh
deleted file mode 100755
index 36b6fee..0000000
--- a/contrib/rerere-train.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/bin/sh
-# Copyright (c) 2008, Nanako Shiraishi
-# Prime rerere database from existing merge commits
-
-me=rerere-train
-USAGE="$me rev-list-args"
-
-SUBDIRECTORY_OK=Yes
-OPTIONS_SPEC=
-. $(git --exec-path)/git-sh-setup
-require_work_tree
-cd_to_toplevel
-
-# Remember original branch
-branch=$(git symbolic-ref -q HEAD) ||
-original_HEAD=$(git rev-parse --verify HEAD) || {
-	echo >&2 "Not on any branch and no commit yet?"
-	exit 1
-}
-
-mkdir -p "$GIT_DIR/rr-cache" || exit
-
-git rev-list --parents "$@" |
-while read commit parent1 other_parents
-do
-	if test -z "$other_parents"
-	then
-		# Skip non-merges
-		continue
-	fi
-	git checkout -q "$parent1^0"
-	if git merge $other_parents >/dev/null 2>&1
-	then
-		# Cleanly merges
-		continue
-	fi
-	if test -s "$GIT_DIR/MERGE_RR"
-	then
-		git show -s --pretty=format:"Learning from %h %s" "$commit"
-		git rerere
-		git checkout -q $commit -- .
-		git rerere
-	fi
-	git reset -q --hard
-done
-
-if test -z "$branch"
-then
-	git checkout "$original_HEAD"
-else
-	git checkout "${branch#refs/heads/}"
-fi
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 15/25] contrib: remove 'remotes2config'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (12 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 14/25] contrib: remove 'rerere-train' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 16/25] contrib: remove 'persistent-https' Felipe Contreras
                   ` (11 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity since 2007. No documentation, no tests.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/remotes2config.sh | 33 ---------------------------------
 1 file changed, 33 deletions(-)
 delete mode 100755 contrib/remotes2config.sh

diff --git a/contrib/remotes2config.sh b/contrib/remotes2config.sh
deleted file mode 100755
index 1cda19f..0000000
--- a/contrib/remotes2config.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-# Use this tool to rewrite your .git/remotes/ files into the config.
-
-. git-sh-setup
-
-if [ -d "$GIT_DIR"/remotes ]; then
-	echo "Rewriting $GIT_DIR/remotes" >&2
-	error=0
-	# rewrite into config
-	{
-		cd "$GIT_DIR"/remotes
-		ls | while read f; do
-			name=$(printf "$f" | tr -c "A-Za-z0-9-" ".")
-			sed -n \
-			-e "s/^URL:[ 	]*\(.*\)$/remote.$name.url \1 ./p" \
-			-e "s/^Pull:[ 	]*\(.*\)$/remote.$name.fetch \1 ^$ /p" \
-			-e "s/^Push:[ 	]*\(.*\)$/remote.$name.push \1 ^$ /p" \
-			< "$f"
-		done
-		echo done
-	} | while read key value regex; do
-		case $key in
-		done)
-			if [ $error = 0 ]; then
-				mv "$GIT_DIR"/remotes "$GIT_DIR"/remotes.old
-			fi ;;
-		*)
-			echo "git config $key "$value" $regex"
-			git config $key "$value" $regex || error=1 ;;
-		esac
-	done
-fi
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 16/25] contrib: remove 'persistent-https'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (13 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 15/25] contrib: remove 'remotes2config' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 17/25] contrib: remove 'git-resurrect' Felipe Contreras
                   ` (10 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity. No tests.

No chance of ever moving into the core because it uses Go.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/persistent-https/LICENSE   | 202 -------------------------------------
 contrib/persistent-https/Makefile  |  38 -------
 contrib/persistent-https/README    |  62 ------------
 contrib/persistent-https/client.go | 189 ----------------------------------
 contrib/persistent-https/main.go   |  82 ---------------
 contrib/persistent-https/proxy.go  | 190 ----------------------------------
 contrib/persistent-https/socket.go |  97 ------------------
 7 files changed, 860 deletions(-)
 delete mode 100644 contrib/persistent-https/LICENSE
 delete mode 100644 contrib/persistent-https/Makefile
 delete mode 100644 contrib/persistent-https/README
 delete mode 100644 contrib/persistent-https/client.go
 delete mode 100644 contrib/persistent-https/main.go
 delete mode 100644 contrib/persistent-https/proxy.go
 delete mode 100644 contrib/persistent-https/socket.go

diff --git a/contrib/persistent-https/LICENSE b/contrib/persistent-https/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/contrib/persistent-https/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/contrib/persistent-https/Makefile b/contrib/persistent-https/Makefile
deleted file mode 100644
index 92baa3b..0000000
--- a/contrib/persistent-https/Makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-# Copyright 2012 Google Inc. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-BUILD_LABEL=$(shell date +"%s")
-TAR_OUT=$(shell go env GOOS)_$(shell go env GOARCH).tar.gz
-
-all: git-remote-persistent-https git-remote-persistent-https--proxy \
-	git-remote-persistent-http
-
-git-remote-persistent-https--proxy: git-remote-persistent-https
-	ln -f -s git-remote-persistent-https git-remote-persistent-https--proxy
-
-git-remote-persistent-http: git-remote-persistent-https
-	ln -f -s git-remote-persistent-https git-remote-persistent-http
-
-git-remote-persistent-https:
-	go build -o git-remote-persistent-https \
-		-ldflags "-X main._BUILD_EMBED_LABEL $(BUILD_LABEL)"
-
-clean:
-	rm -f git-remote-persistent-http* *.tar.gz
-
-tar: clean all
-	@chmod 555 git-remote-persistent-https
-	@tar -czf $(TAR_OUT) git-remote-persistent-http* README LICENSE
-	@echo
-	@echo "Created $(TAR_OUT)"
diff --git a/contrib/persistent-https/README b/contrib/persistent-https/README
deleted file mode 100644
index f784dd2..0000000
--- a/contrib/persistent-https/README
+++ /dev/null
@@ -1,62 +0,0 @@
-git-remote-persistent-https
-
-The git-remote-persistent-https binary speeds up SSL operations
-by running a daemon job (git-remote-persistent-https--proxy) that
-keeps a connection open to a server.
-
-
-PRE-BUILT BINARIES
-
-Darwin amd64:
-https://commondatastorage.googleapis.com/git-remote-persistent-https/darwin_amd64.tar.gz
-
-Linux amd64:
-https://commondatastorage.googleapis.com/git-remote-persistent-https/linux_amd64.tar.gz
-
-
-INSTALLING
-
-Move all of the git-remote-persistent-http* binaries to a directory
-in PATH.
-
-
-USAGE
-
-HTTPS requests can be delegated to the proxy by using the
-"persistent-https" scheme, e.g.
-
-git clone persistent-https://kernel.googlesource.com/pub/scm/git/git
-
-Likewise, .gitconfig can be updated as follows to rewrite https urls
-to use persistent-https:
-
-[url "persistent-https"]
-	insteadof = https
-[url "persistent-http"]
-	insteadof = http
-
-
-#####################################################################
-# BUILDING FROM SOURCE
-#####################################################################
-
-LOCATION
-
-The source is available in the contrib/persistent-https directory of
-the Git source repository. The Git source repository is available at
-git://git.kernel.org/pub/scm/git/git.git/
-https://kernel.googlesource.com/pub/scm/git/git
-
-
-PREREQUISITES
-
-The code is written in Go (http://golang.org/) and the Go compiler is
-required. Currently, the compiler must be built and installed from tip
-of source, in order to include a fix in the reverse http proxy:
-http://code.google.com/p/go/source/detail?r=a615b796570a2cd8591884767a7d67ede74f6648
-
-
-BUILDING
-
-Run "make" to build the binaries. See the section on
-INSTALLING above.
diff --git a/contrib/persistent-https/client.go b/contrib/persistent-https/client.go
deleted file mode 100644
index 71125b5..0000000
--- a/contrib/persistent-https/client.go
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2012 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package main
-
-import (
-	"bufio"
-	"errors"
-	"fmt"
-	"net"
-	"net/url"
-	"os"
-	"os/exec"
-	"strings"
-	"syscall"
-	"time"
-)
-
-type Client struct {
-	ProxyBin string
-	Args     []string
-
-	insecure bool
-}
-
-func (c *Client) Run() error {
-	if err := c.resolveArgs(); err != nil {
-		return fmt.Errorf("resolveArgs() got error: %v", err)
-	}
-
-	// Connect to the proxy.
-	uconn, hconn, addr, err := c.connect()
-	if err != nil {
-		return fmt.Errorf("connect() got error: %v", err)
-	}
-	// Keep the unix socket connection open for the duration of the request.
-	defer uconn.Close()
-	// Keep a connection to the HTTP server open, so no other user can
-	// bind on the same address so long as the process is running.
-	defer hconn.Close()
-
-	// Start the git-remote-http subprocess.
-	cargs := []string{"-c", fmt.Sprintf("http.proxy=%v", addr), "remote-http"}
-	cargs = append(cargs, c.Args...)
-	cmd := exec.Command("git", cargs...)
-
-	for _, v := range os.Environ() {
-		if !strings.HasPrefix(v, "GIT_PERSISTENT_HTTPS_SECURE=") {
-			cmd.Env = append(cmd.Env, v)
-		}
-	}
-	// Set the GIT_PERSISTENT_HTTPS_SECURE environment variable when
-	// the proxy is using a SSL connection.  This allows credential helpers
-	// to identify secure proxy connections, despite being passed an HTTP
-	// scheme.
-	if !c.insecure {
-		cmd.Env = append(cmd.Env, "GIT_PERSISTENT_HTTPS_SECURE=1")
-	}
-
-	cmd.Stdin = os.Stdin
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	if err := cmd.Run(); err != nil {
-		if eerr, ok := err.(*exec.ExitError); ok {
-			if stat, ok := eerr.ProcessState.Sys().(syscall.WaitStatus); ok && stat.ExitStatus() != 0 {
-				os.Exit(stat.ExitStatus())
-			}
-		}
-		return fmt.Errorf("git-remote-http subprocess got error: %v", err)
-	}
-	return nil
-}
-
-func (c *Client) connect() (uconn net.Conn, hconn net.Conn, addr string, err error) {
-	uconn, err = DefaultSocket.Dial()
-	if err != nil {
-		if e, ok := err.(*net.OpError); ok && (os.IsNotExist(e.Err) || e.Err == syscall.ECONNREFUSED) {
-			if err = c.startProxy(); err == nil {
-				uconn, err = DefaultSocket.Dial()
-			}
-		}
-		if err != nil {
-			return
-		}
-	}
-
-	if addr, err = c.readAddr(uconn); err != nil {
-		return
-	}
-
-	// Open a tcp connection to the proxy.
-	if hconn, err = net.Dial("tcp", addr); err != nil {
-		return
-	}
-
-	// Verify the address hasn't changed ownership.
-	var addr2 string
-	if addr2, err = c.readAddr(uconn); err != nil {
-		return
-	} else if addr != addr2 {
-		err = fmt.Errorf("address changed after connect. got %q, want %q", addr2, addr)
-		return
-	}
-	return
-}
-
-func (c *Client) readAddr(conn net.Conn) (string, error) {
-	conn.SetDeadline(time.Now().Add(5 * time.Second))
-	data := make([]byte, 100)
-	n, err := conn.Read(data)
-	if err != nil {
-		return "", fmt.Errorf("error reading unix socket: %v", err)
-	} else if n == 0 {
-		return "", errors.New("empty data response")
-	}
-	conn.Write([]byte{1}) // Ack
-
-	var addr string
-	if addrs := strings.Split(string(data[:n]), "\n"); len(addrs) != 2 {
-		return "", fmt.Errorf("got %q, wanted 2 addresses", data[:n])
-	} else if c.insecure {
-		addr = addrs[1]
-	} else {
-		addr = addrs[0]
-	}
-	return addr, nil
-}
-
-func (c *Client) startProxy() error {
-	cmd := exec.Command(c.ProxyBin)
-	cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
-	stdout, err := cmd.StdoutPipe()
-	if err != nil {
-		return err
-	}
-	defer stdout.Close()
-	if err := cmd.Start(); err != nil {
-		return err
-	}
-	result := make(chan error)
-	go func() {
-		bytes, _, err := bufio.NewReader(stdout).ReadLine()
-		if line := string(bytes); err == nil && line != "OK" {
-			err = fmt.Errorf("proxy returned %q, want \"OK\"", line)
-		}
-		result <- err
-	}()
-	select {
-	case err := <-result:
-		return err
-	case <-time.After(5 * time.Second):
-		return errors.New("timeout waiting for proxy to start")
-	}
-	panic("not reachable")
-}
-
-func (c *Client) resolveArgs() error {
-	if nargs := len(c.Args); nargs == 0 {
-		return errors.New("remote needed")
-	} else if nargs > 2 {
-		return fmt.Errorf("want at most 2 args, got %v", c.Args)
-	}
-
-	// Rewrite the url scheme to be http.
-	idx := len(c.Args) - 1
-	rawurl := c.Args[idx]
-	rurl, err := url.Parse(rawurl)
-	if err != nil {
-		return fmt.Errorf("invalid remote: %v", err)
-	}
-	c.insecure = rurl.Scheme == "persistent-http"
-	rurl.Scheme = "http"
-	c.Args[idx] = rurl.String()
-	if idx != 0 && c.Args[0] == rawurl {
-		c.Args[0] = c.Args[idx]
-	}
-	return nil
-}
diff --git a/contrib/persistent-https/main.go b/contrib/persistent-https/main.go
deleted file mode 100644
index fd1b107..0000000
--- a/contrib/persistent-https/main.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2012 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// The git-remote-persistent-https binary speeds up SSL operations by running
-// a daemon job that keeps a connection open to a Git server. This ensures the
-// git-remote-persistent-https--proxy is running and delegating execution
-// to the git-remote-http binary with the http_proxy set to the daemon job.
-// A unix socket is used to authenticate the proxy and discover the
-// HTTP address. Note, both the client and proxy are included in the same
-// binary.
-package main
-
-import (
-	"flag"
-	"fmt"
-	"log"
-	"os"
-	"strings"
-	"time"
-)
-
-var (
-	forceProxy = flag.Bool("proxy", false, "Whether to start the binary in proxy mode")
-	proxyBin   = flag.String("proxy_bin", "git-remote-persistent-https--proxy", "Path to the proxy binary")
-	printLabel = flag.Bool("print_label", false, "Prints the build label for the binary")
-
-	// Variable that should be defined through the -X linker flag.
-	_BUILD_EMBED_LABEL string
-)
-
-const (
-	defaultMaxIdleDuration    = 24 * time.Hour
-	defaultPollUpdateInterval = 15 * time.Minute
-)
-
-func main() {
-	flag.Parse()
-	if *printLabel {
-		// Short circuit execution to print the build label
-		fmt.Println(buildLabel())
-		return
-	}
-
-	var err error
-	if *forceProxy || strings.HasSuffix(os.Args[0], "--proxy") {
-		log.SetPrefix("git-remote-persistent-https--proxy: ")
-		proxy := &Proxy{
-			BuildLabel:         buildLabel(),
-			MaxIdleDuration:    defaultMaxIdleDuration,
-			PollUpdateInterval: defaultPollUpdateInterval,
-		}
-		err = proxy.Run()
-	} else {
-		log.SetPrefix("git-remote-persistent-https: ")
-		client := &Client{
-			ProxyBin: *proxyBin,
-			Args:     flag.Args(),
-		}
-		err = client.Run()
-	}
-	if err != nil {
-		log.Fatalln(err)
-	}
-}
-
-func buildLabel() string {
-	if _BUILD_EMBED_LABEL == "" {
-		log.Println(`unlabeled build; build with "make" to label`)
-	}
-	return _BUILD_EMBED_LABEL
-}
diff --git a/contrib/persistent-https/proxy.go b/contrib/persistent-https/proxy.go
deleted file mode 100644
index bb0cdba..0000000
--- a/contrib/persistent-https/proxy.go
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2012 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package main
-
-import (
-	"fmt"
-	"log"
-	"net"
-	"net/http"
-	"net/http/httputil"
-	"os"
-	"os/exec"
-	"os/signal"
-	"sync"
-	"syscall"
-	"time"
-)
-
-type Proxy struct {
-	BuildLabel         string
-	MaxIdleDuration    time.Duration
-	PollUpdateInterval time.Duration
-
-	ul        net.Listener
-	httpAddr  string
-	httpsAddr string
-}
-
-func (p *Proxy) Run() error {
-	hl, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		return fmt.Errorf("http listen failed: %v", err)
-	}
-	defer hl.Close()
-
-	hsl, err := net.Listen("tcp", "127.0.0.1:0")
-	if err != nil {
-		return fmt.Errorf("https listen failed: %v", err)
-	}
-	defer hsl.Close()
-
-	p.ul, err = DefaultSocket.Listen()
-	if err != nil {
-		c, derr := DefaultSocket.Dial()
-		if derr == nil {
-			c.Close()
-			fmt.Println("OK\nA proxy is already running... exiting")
-			return nil
-		} else if e, ok := derr.(*net.OpError); ok && e.Err == syscall.ECONNREFUSED {
-			// Nothing is listening on the socket, unlink it and try again.
-			syscall.Unlink(DefaultSocket.Path())
-			p.ul, err = DefaultSocket.Listen()
-		}
-		if err != nil {
-			return fmt.Errorf("unix listen failed on %v: %v", DefaultSocket.Path(), err)
-		}
-	}
-	defer p.ul.Close()
-	go p.closeOnSignal()
-	go p.closeOnUpdate()
-
-	p.httpAddr = hl.Addr().String()
-	p.httpsAddr = hsl.Addr().String()
-	fmt.Printf("OK\nListening on unix socket=%v http=%v https=%v\n",
-		p.ul.Addr(), p.httpAddr, p.httpsAddr)
-
-	result := make(chan error, 2)
-	go p.serveUnix(result)
-	go func() {
-		result <- http.Serve(hl, &httputil.ReverseProxy{
-			FlushInterval: 500 * time.Millisecond,
-			Director:      func(r *http.Request) {},
-		})
-	}()
-	go func() {
-		result <- http.Serve(hsl, &httputil.ReverseProxy{
-			FlushInterval: 500 * time.Millisecond,
-			Director: func(r *http.Request) {
-				r.URL.Scheme = "https"
-			},
-		})
-	}()
-	return <-result
-}
-
-type socketContext struct {
-	sync.WaitGroup
-	mutex sync.Mutex
-	last  time.Time
-}
-
-func (sc *socketContext) Done() {
-	sc.mutex.Lock()
-	defer sc.mutex.Unlock()
-	sc.last = time.Now()
-	sc.WaitGroup.Done()
-}
-
-func (p *Proxy) serveUnix(result chan<- error) {
-	sockCtx := &socketContext{}
-	go p.closeOnIdle(sockCtx)
-
-	var err error
-	for {
-		var uconn net.Conn
-		uconn, err = p.ul.Accept()
-		if err != nil {
-			err = fmt.Errorf("accept failed: %v", err)
-			break
-		}
-		sockCtx.Add(1)
-		go p.handleUnixConn(sockCtx, uconn)
-	}
-	sockCtx.Wait()
-	result <- err
-}
-
-func (p *Proxy) handleUnixConn(sockCtx *socketContext, uconn net.Conn) {
-	defer sockCtx.Done()
-	defer uconn.Close()
-	data := []byte(fmt.Sprintf("%v\n%v", p.httpsAddr, p.httpAddr))
-	uconn.SetDeadline(time.Now().Add(5 * time.Second))
-	for i := 0; i < 2; i++ {
-		if n, err := uconn.Write(data); err != nil {
-			log.Printf("error sending http addresses: %+v\n", err)
-			return
-		} else if n != len(data) {
-			log.Printf("sent %d data bytes, wanted %d\n", n, len(data))
-			return
-		}
-		if _, err := uconn.Read([]byte{0, 0, 0, 0}); err != nil {
-			log.Printf("error waiting for Ack: %+v\n", err)
-			return
-		}
-	}
-	// Wait without a deadline for the client to finish via EOF
-	uconn.SetDeadline(time.Time{})
-	uconn.Read([]byte{0, 0, 0, 0})
-}
-
-func (p *Proxy) closeOnIdle(sockCtx *socketContext) {
-	for d := p.MaxIdleDuration; d > 0; {
-		time.Sleep(d)
-		sockCtx.Wait()
-		sockCtx.mutex.Lock()
-		if d = sockCtx.last.Add(p.MaxIdleDuration).Sub(time.Now()); d <= 0 {
-			log.Println("graceful shutdown from idle timeout")
-			p.ul.Close()
-		}
-		sockCtx.mutex.Unlock()
-	}
-}
-
-func (p *Proxy) closeOnUpdate() {
-	for {
-		time.Sleep(p.PollUpdateInterval)
-		if out, err := exec.Command(os.Args[0], "--print_label").Output(); err != nil {
-			log.Printf("error polling for updated binary: %v\n", err)
-		} else if s := string(out[:len(out)-1]); p.BuildLabel != s {
-			log.Printf("graceful shutdown from updated binary: %q --> %q\n", p.BuildLabel, s)
-			p.ul.Close()
-			break
-		}
-	}
-}
-
-func (p *Proxy) closeOnSignal() {
-	ch := make(chan os.Signal, 10)
-	signal.Notify(ch, os.Interrupt, os.Kill, os.Signal(syscall.SIGTERM), os.Signal(syscall.SIGHUP))
-	sig := <-ch
-	p.ul.Close()
-	switch sig {
-	case os.Signal(syscall.SIGHUP):
-		log.Printf("graceful shutdown from signal: %v\n", sig)
-	default:
-		log.Fatalf("exiting from signal: %v\n", sig)
-	}
-}
diff --git a/contrib/persistent-https/socket.go b/contrib/persistent-https/socket.go
deleted file mode 100644
index 193b911..0000000
--- a/contrib/persistent-https/socket.go
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2012 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package main
-
-import (
-	"fmt"
-	"log"
-	"net"
-	"os"
-	"path/filepath"
-	"syscall"
-)
-
-// A Socket is a wrapper around a Unix socket that verifies directory
-// permissions.
-type Socket struct {
-	Dir string
-}
-
-func defaultDir() string {
-	sockPath := ".git-credential-cache"
-	if home := os.Getenv("HOME"); home != "" {
-		return filepath.Join(home, sockPath)
-	}
-	log.Printf("socket: cannot find HOME path. using relative directory %q for socket", sockPath)
-	return sockPath
-}
-
-// DefaultSocket is a Socket in the $HOME/.git-credential-cache directory.
-var DefaultSocket = Socket{Dir: defaultDir()}
-
-// Listen announces the local network address of the unix socket. The
-// permissions on the socket directory are verified before attempting
-// the actual listen.
-func (s Socket) Listen() (net.Listener, error) {
-	network, addr := "unix", s.Path()
-	if err := s.mkdir(); err != nil {
-		return nil, &net.OpError{Op: "listen", Net: network, Addr: &net.UnixAddr{Name: addr, Net: network}, Err: err}
-	}
-	return net.Listen(network, addr)
-}
-
-// Dial connects to the unix socket. The permissions on the socket directory
-// are verified before attempting the actual dial.
-func (s Socket) Dial() (net.Conn, error) {
-	network, addr := "unix", s.Path()
-	if err := s.checkPermissions(); err != nil {
-		return nil, &net.OpError{Op: "dial", Net: network, Addr: &net.UnixAddr{Name: addr, Net: network}, Err: err}
-	}
-	return net.Dial(network, addr)
-}
-
-// Path returns the fully specified file name of the unix socket.
-func (s Socket) Path() string {
-	return filepath.Join(s.Dir, "persistent-https-proxy-socket")
-}
-
-func (s Socket) mkdir() error {
-	if err := s.checkPermissions(); err == nil {
-		return nil
-	} else if !os.IsNotExist(err) {
-		return err
-	}
-	if err := os.MkdirAll(s.Dir, 0700); err != nil {
-		return err
-	}
-	return s.checkPermissions()
-}
-
-func (s Socket) checkPermissions() error {
-	fi, err := os.Stat(s.Dir)
-	if err != nil {
-		return err
-	}
-	if !fi.IsDir() {
-		return fmt.Errorf("socket: got file, want directory for %q", s.Dir)
-	}
-	if fi.Mode().Perm() != 0700 {
-		return fmt.Errorf("socket: got perm %o, want 700 for %q", fi.Mode().Perm(), s.Dir)
-	}
-	if st := fi.Sys().(*syscall.Stat_t); int(st.Uid) != os.Getuid() {
-		return fmt.Errorf("socket: got uid %d, want %d for %q", st.Uid, os.Getuid(), s.Dir)
-	}
-	return nil
-}
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 17/25] contrib: remove 'git-resurrect'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (14 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 16/25] contrib: remove 'persistent-https' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 18/25] contrib: remove 'emacs' Felipe Contreras
                   ` (9 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras

No activity, no documentation, no tests, no chance of ever graduating.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/git-resurrect.sh | 182 -----------------------------------------------
 1 file changed, 182 deletions(-)
 delete mode 100755 contrib/git-resurrect.sh

diff --git a/contrib/git-resurrect.sh b/contrib/git-resurrect.sh
deleted file mode 100755
index d7e97bb..0000000
--- a/contrib/git-resurrect.sh
+++ /dev/null
@@ -1,182 +0,0 @@
-#!/bin/sh
-
-USAGE="[-a] [-r] [-m] [-t] [-n] [-b <newname>] <name>"
-LONG_USAGE="git-resurrect attempts to find traces of a branch tip
-called <name>, and tries to resurrect it.  Currently, the reflog is
-searched for checkout messages, and with -r also merge messages.  With
--m and -t, the history of all refs is scanned for Merge <name> into
-other/Merge <other> into <name> (respectively) commit subjects, which
-is rather slow but allows you to resurrect other people's topic
-branches."
-
-OPTIONS_KEEPDASHDASH=
-OPTIONS_STUCKLONG=
-OPTIONS_SPEC="\
-git resurrect $USAGE
---
-b,branch=            save branch as <newname> instead of <name>
-a,all                same as -l -r -m -t
-k,keep-going         full rev-list scan (instead of first match)
-l,reflog             scan reflog for checkouts (enabled by default)
-r,reflog-merges      scan for merges recorded in reflog
-m,merges             scan for merges into other branches (slow)
-t,merge-targets      scan for merges of other branches into <name>
-n,dry-run            don't recreate the branch"
-
-. git-sh-setup
-
-search_reflog () {
-        sed -ne 's~^\([^ ]*\) .*\tcheckout: moving from '"$1"' .*~\1~p' \
-                < "$GIT_DIR"/logs/HEAD
-}
-
-search_reflog_merges () {
-	git rev-parse $(
-		sed -ne 's~^[^ ]* \([^ ]*\) .*\tmerge '"$1"':.*~\1^2~p' \
-			< "$GIT_DIR"/logs/HEAD
-	)
-}
-
-_x40="[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]"
-_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
-
-search_merges () {
-        git rev-list --all --grep="Merge branch '$1'" \
-                --pretty=tformat:"%P %s" |
-        sed -ne "/^$_x40 \($_x40\) Merge .*/ {s//\1/p;$early_exit}"
-}
-
-search_merge_targets () {
-	git rev-list --all --grep="Merge branch '[^']*' into $branch\$" \
-		--pretty=tformat:"%H %s" --all |
-	sed -ne "/^\($_x40\) Merge .*/ {s//\1/p;$early_exit} "
-}
-
-dry_run=
-early_exit=q
-scan_reflog=t
-scan_reflog_merges=
-scan_merges=
-scan_merge_targets=
-new_name=
-
-while test "$#" != 0; do
-	case "$1" in
-	    -b|--branch)
-		shift
-		new_name="$1"
-		;;
-	    -n|--dry-run)
-		dry_run=t
-		;;
-	    --no-dry-run)
-		dry_run=
-		;;
-	    -k|--keep-going)
-		early_exit=
-		;;
-	    --no-keep-going)
-		early_exit=q
-		;;
-	    -m|--merges)
-		scan_merges=t
-		;;
-	    --no-merges)
-		scan_merges=
-		;;
-	    -l|--reflog)
-		scan_reflog=t
-		;;
-	    --no-reflog)
-		scan_reflog=
-		;;
-	    -r|--reflog_merges)
-		scan_reflog_merges=t
-		;;
-	    --no-reflog_merges)
-		scan_reflog_merges=
-		;;
-	    -t|--merge-targets)
-		scan_merge_targets=t
-		;;
-	    --no-merge-targets)
-		scan_merge_targets=
-		;;
-	    -a|--all)
-		scan_reflog=t
-		scan_reflog_merges=t
-		scan_merges=t
-		scan_merge_targets=t
-		;;
-	    --)
-		shift
-		break
-		;;
-	    *)
-		usage
-		;;
-	esac
-	shift
-done
-
-test "$#" = 1 || usage
-
-all_strategies="$scan_reflog$scan_reflog_merges$scan_merges$scan_merge_targets"
-if test -z "$all_strategies"; then
-	die "must enable at least one of -lrmt"
-fi
-
-branch="$1"
-test -z "$new_name" && new_name="$branch"
-
-if test ! -z "$scan_reflog"; then
-	if test -r "$GIT_DIR"/logs/HEAD; then
-		candidates="$(search_reflog $branch)"
-	else
-		die 'reflog scanning requested, but' \
-			'$GIT_DIR/logs/HEAD not readable'
-	fi
-fi
-if test ! -z "$scan_reflog_merges"; then
-	if test -r "$GIT_DIR"/logs/HEAD; then
-		candidates="$candidates $(search_reflog_merges $branch)"
-	else
-		die 'reflog scanning requested, but' \
-			'$GIT_DIR/logs/HEAD not readable'
-	fi
-fi
-if test ! -z "$scan_merges"; then
-	candidates="$candidates $(search_merges $branch)"
-fi
-if test ! -z "$scan_merge_targets"; then
-	candidates="$candidates $(search_merge_targets $branch)"
-fi
-
-candidates="$(git rev-parse $candidates | sort -u)"
-
-if test -z "$candidates"; then
-	hint=
-	test "z$all_strategies" != "ztttt" \
-		&& hint=" (maybe try again with -a)"
-	die "no candidates for $branch found$hint"
-fi
-
-echo "** Candidates for $branch **"
-for cmt in $candidates; do
-	git --no-pager log --pretty=tformat:"%ct:%h [%cr] %s" --abbrev-commit -1 $cmt
-done \
-| sort -n | cut -d: -f2-
-
-newest="$(git rev-list -1 $candidates)"
-if test ! -z "$dry_run"; then
-	printf "** Most recent: "
-	git --no-pager log -1 --pretty=tformat:"%h %s" $newest
-elif ! git rev-parse --verify --quiet $new_name >/dev/null; then
-	printf "** Restoring $new_name to "
-	git --no-pager log -1 --pretty=tformat:"%h %s" $newest
-	git branch $new_name $newest
-else
-	printf "Most recent: "
-	git --no-pager log -1 --pretty=tformat:"%h %s" $newest
-	echo "** $new_name already exists, doing nothing"
-fi
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 18/25] contrib: remove 'emacs'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (15 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 17/25] contrib: remove 'git-resurrect' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
       [not found]   ` <CAFcZeCqbF54-KjHU1R3pC6XgWi21KcpRGB7HcbfSGyvTScQU2A@mail.gmail.com>
  2014-05-09  0:58 ` [PATCH v1 19/25] contrib: remove 'diff-highlight' Felipe Contreras
                   ` (8 subsequent siblings)
  25 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Felipe Contreras, Alexandre Julliard,
	David Kågedal, Jakub Narębski

No activity since 2012, no tests, and no chance of ever graduating.

Also, probably better out-of-tree tools out there.

Cc: Alexandre Julliard <julliard@winehq.org>
Cc: David Kågedal <davidk@lysator.liu.se>
Cc: Jakub Narębski <jnareb@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/emacs/.gitignore   |    1 -
 contrib/emacs/Makefile     |   21 -
 contrib/emacs/README       |   39 -
 contrib/emacs/git-blame.el |  484 -------------
 contrib/emacs/git.el       | 1705 --------------------------------------------
 5 files changed, 2250 deletions(-)
 delete mode 100644 contrib/emacs/.gitignore
 delete mode 100644 contrib/emacs/Makefile
 delete mode 100644 contrib/emacs/README
 delete mode 100644 contrib/emacs/git-blame.el
 delete mode 100644 contrib/emacs/git.el

diff --git a/contrib/emacs/.gitignore b/contrib/emacs/.gitignore
deleted file mode 100644
index c531d98..0000000
--- a/contrib/emacs/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.elc
diff --git a/contrib/emacs/Makefile b/contrib/emacs/Makefile
deleted file mode 100644
index 24d9312..0000000
--- a/contrib/emacs/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-## Build and install stuff
-
-EMACS = emacs
-
-ELC = git.elc git-blame.elc
-INSTALL ?= install
-INSTALL_ELC = $(INSTALL) -m 644
-prefix ?= $(HOME)
-emacsdir = $(prefix)/share/emacs/site-lisp
-RM ?= rm -f
-
-all: $(ELC)
-
-install: all
-	$(INSTALL) -d $(DESTDIR)$(emacsdir)
-	$(INSTALL_ELC) $(ELC:.elc=.el) $(ELC) $(DESTDIR)$(emacsdir)
-
-%.elc: %.el
-	$(EMACS) -batch -f batch-byte-compile $<
-
-clean:; $(RM) $(ELC)
diff --git a/contrib/emacs/README b/contrib/emacs/README
deleted file mode 100644
index 82368bd..0000000
--- a/contrib/emacs/README
+++ /dev/null
@@ -1,39 +0,0 @@
-This directory contains various modules for Emacs support.
-
-To make the modules available to Emacs, you should add this directory
-to your load-path, and then require the modules you want. This can be
-done by adding to your .emacs something like this:
-
-  (add-to-list 'load-path ".../git/contrib/emacs")
-  (require 'git)
-  (require 'git-blame)
-
-
-The following modules are available:
-
-* git.el:
-
-  Status manager that displays the state of all the files of the
-  project, and provides easy access to the most frequently used git
-  commands. The user interface is as far as possible compatible with
-  the pcl-cvs mode. It can be started with `M-x git-status'.
-
-* git-blame.el:
-
-  Emacs implementation of incremental git-blame.  When you turn it on
-  while viewing a file, the editor buffer will be updated by setting
-  the background of individual lines to a color that reflects which
-  commit it comes from.  And when you move around the buffer, a
-  one-line summary will be shown in the echo area.
-
-* vc-git.el:
-
-  This file used to contain the VC-mode backend for git, but it is no
-  longer distributed with git. It is now maintained as part of Emacs
-  and included in standard Emacs distributions starting from version
-  22.2.
-
-  If you have an earlier Emacs version, upgrading to Emacs 22 is
-  recommended, since the VC mode in older Emacs is not generic enough
-  to be able to support git in a reasonable manner, and no attempt has
-  been made to backport vc-git.el.
diff --git a/contrib/emacs/git-blame.el b/contrib/emacs/git-blame.el
deleted file mode 100644
index e671f6c..0000000
--- a/contrib/emacs/git-blame.el
+++ /dev/null
@@ -1,484 +0,0 @@
-;;; git-blame.el --- Minor mode for incremental blame for Git  -*- coding: utf-8 -*-
-;;
-;; Copyright (C) 2007  David Kågedal
-;;
-;; Authors:    David Kågedal <davidk@lysator.liu.se>
-;; Created:    31 Jan 2007
-;; Message-ID: <87iren2vqx.fsf@morpheus.local>
-;; License:    GPL
-;; Keywords:   git, version control, release management
-;;
-;; Compatibility: Emacs21, Emacs22 and EmacsCVS
-;;                Git 1.5 and up
-
-;; This file is *NOT* part of GNU Emacs.
-;; This file is distributed under the same terms as GNU Emacs.
-
-;; 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., 59 Temple Place, Suite 330, Boston,
-;; MA 02111-1307 USA
-
-;; http://www.fsf.org/copyleft/gpl.html
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Commentary:
-;;
-;; Here is an Emacs implementation of incremental git-blame.  When you
-;; turn it on while viewing a file, the editor buffer will be updated by
-;; setting the background of individual lines to a color that reflects
-;; which commit it comes from.  And when you move around the buffer, a
-;; one-line summary will be shown in the echo area.
-
-;;; Installation:
-;;
-;; To use this package, put it somewhere in `load-path' (or add
-;; directory with git-blame.el to `load-path'), and add the following
-;; line to your .emacs:
-;;
-;;    (require 'git-blame)
-;;
-;; If you do not want to load this package before it is necessary, you
-;; can make use of the `autoload' feature, e.g. by adding to your .emacs
-;; the following lines
-;;
-;;    (autoload 'git-blame-mode "git-blame"
-;;              "Minor mode for incremental blame for Git." t)
-;;
-;; Then first use of `M-x git-blame-mode' would load the package.
-
-;;; Compatibility:
-;;
-;; It requires GNU Emacs 21 or later and Git 1.5.0 and up
-;;
-;; If you'are using Emacs 20, try changing this:
-;;
-;;            (overlay-put ovl 'face (list :background
-;;                                         (cdr (assq 'color (cddddr info)))))
-;;
-;; to
-;;
-;;            (overlay-put ovl 'face (cons 'background-color
-;;                                         (cdr (assq 'color (cddddr info)))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;;; Code:
-
-(eval-when-compile (require 'cl))			      ; to use `push', `pop'
-(require 'format-spec)
-
-(defface git-blame-prefix-face
-  '((((background dark)) (:foreground "gray"
-                          :background "black"))
-    (((background light)) (:foreground "gray"
-                           :background "white"))
-    (t (:weight bold)))
-  "The face used for the hash prefix."
-  :group 'git-blame)
-
-(defgroup git-blame nil
-  "A minor mode showing Git blame information."
-  :group 'git
-  :link '(function-link git-blame-mode))
-
-
-(defcustom git-blame-use-colors t
-  "Use colors to indicate commits in `git-blame-mode'."
-  :type 'boolean
-  :group 'git-blame)
-
-(defcustom git-blame-prefix-format
-  "%h %20A:"
-  "The format of the prefix added to each line in `git-blame'
-mode. The format is passed to `format-spec' with the following format keys:
-
-  %h - the abbreviated hash
-  %H - the full hash
-  %a - the author name
-  %A - the author email
-  %c - the committer name
-  %C - the committer email
-  %s - the commit summary
-"
-  :group 'git-blame)
-
-(defcustom git-blame-mouseover-format
-  "%h %a %A: %s"
-  "The format of the description shown when pointing at a line in
-`git-blame' mode. The format string is passed to `format-spec'
-with the following format keys:
-
-  %h - the abbreviated hash
-  %H - the full hash
-  %a - the author name
-  %A - the author email
-  %c - the committer name
-  %C - the committer email
-  %s - the commit summary
-"
-  :group 'git-blame)
-
-
-(defun git-blame-color-scale (&rest elements)
-  "Given a list, returns a list of triples formed with each
-elements of the list.
-
-a b => bbb bba bab baa abb aba aaa aab"
-  (let (result)
-    (dolist (a elements)
-      (dolist (b elements)
-        (dolist (c elements)
-          (setq result (cons (format "#%s%s%s" a b c) result)))))
-    result))
-
-;; (git-blame-color-scale "0c" "04" "24" "1c" "2c" "34" "14" "3c") =>
-;; ("#3c3c3c" "#3c3c14" "#3c3c34" "#3c3c2c" "#3c3c1c" "#3c3c24"
-;; "#3c3c04" "#3c3c0c" "#3c143c" "#3c1414" "#3c1434" "#3c142c" ...)
-
-(defmacro git-blame-random-pop (l)
-  "Select a random element from L and returns it. Also remove
-selected element from l."
-  ;; only works on lists with unique elements
-  `(let ((e (elt ,l (random (length ,l)))))
-     (setq ,l (remove e ,l))
-     e))
-
-(defvar git-blame-log-oneline-format
-  "format:[%cr] %cn: %s"
-  "*Formatting option used for describing current line in the minibuffer.
-
-This option is used to pass to git log --pretty= command-line option,
-and describe which commit the current line was made.")
-
-(defvar git-blame-dark-colors
-  (git-blame-color-scale "0c" "04" "24" "1c" "2c" "34" "14" "3c")
-  "*List of colors (format #RGB) to use in a dark environment.
-
-To check out the list, evaluate (list-colors-display git-blame-dark-colors).")
-
-(defvar git-blame-light-colors
-  (git-blame-color-scale "c4" "d4" "cc" "dc" "f4" "e4" "fc" "ec")
-  "*List of colors (format #RGB) to use in a light environment.
-
-To check out the list, evaluate (list-colors-display git-blame-light-colors).")
-
-(defvar git-blame-colors '()
-  "Colors used by git-blame. The list is built once when activating git-blame
-minor mode.")
-
-(defvar git-blame-ancient-color "dark green"
-  "*Color to be used for ancient commit.")
-
-(defvar git-blame-autoupdate t
-  "*Automatically update the blame display while editing")
-
-(defvar git-blame-proc nil
-  "The running git-blame process")
-(make-variable-buffer-local 'git-blame-proc)
-
-(defvar git-blame-overlays nil
-  "The git-blame overlays used in the current buffer.")
-(make-variable-buffer-local 'git-blame-overlays)
-
-(defvar git-blame-cache nil
-  "A cache of git-blame information for the current buffer")
-(make-variable-buffer-local 'git-blame-cache)
-
-(defvar git-blame-idle-timer nil
-  "An idle timer that updates the blame")
-(make-variable-buffer-local 'git-blame-cache)
-
-(defvar git-blame-update-queue nil
-  "A queue of update requests")
-(make-variable-buffer-local 'git-blame-update-queue)
-
-;; FIXME: docstrings
-(defvar git-blame-file nil)
-(defvar git-blame-current nil)
-
-(defvar git-blame-mode nil)
-(make-variable-buffer-local 'git-blame-mode)
-
-(defvar git-blame-mode-line-string " blame"
-  "String to display on the mode line when git-blame is active.")
-
-(or (assq 'git-blame-mode minor-mode-alist)
-    (setq minor-mode-alist
-	  (cons '(git-blame-mode git-blame-mode-line-string) minor-mode-alist)))
-
-;;;###autoload
-(defun git-blame-mode (&optional arg)
-  "Toggle minor mode for displaying Git blame
-
-With prefix ARG, turn the mode on if ARG is positive."
-  (interactive "P")
-  (cond
-   ((null arg)
-    (if git-blame-mode (git-blame-mode-off) (git-blame-mode-on)))
-   ((> (prefix-numeric-value arg) 0) (git-blame-mode-on))
-   (t (git-blame-mode-off))))
-
-(defun git-blame-mode-on ()
-  "Turn on git-blame mode.
-
-See also function `git-blame-mode'."
-  (make-local-variable 'git-blame-colors)
-  (if git-blame-autoupdate
-      (add-hook 'after-change-functions 'git-blame-after-change nil t)
-    (remove-hook 'after-change-functions 'git-blame-after-change t))
-  (git-blame-cleanup)
-  (let ((bgmode (cdr (assoc 'background-mode (frame-parameters)))))
-    (if (eq bgmode 'dark)
-	(setq git-blame-colors git-blame-dark-colors)
-      (setq git-blame-colors git-blame-light-colors)))
-  (setq git-blame-cache (make-hash-table :test 'equal))
-  (setq git-blame-mode t)
-  (git-blame-run))
-
-(defun git-blame-mode-off ()
-  "Turn off git-blame mode.
-
-See also function `git-blame-mode'."
-  (git-blame-cleanup)
-  (if git-blame-idle-timer (cancel-timer git-blame-idle-timer))
-  (setq git-blame-mode nil))
-
-;;;###autoload
-(defun git-reblame ()
-  "Recalculate all blame information in the current buffer"
-  (interactive)
-  (unless git-blame-mode
-    (error "Git-blame is not active"))
-
-  (git-blame-cleanup)
-  (git-blame-run))
-
-(defun git-blame-run (&optional startline endline)
-  (if git-blame-proc
-      ;; Should maybe queue up a new run here
-      (message "Already running git blame")
-    (let ((display-buf (current-buffer))
-          (blame-buf (get-buffer-create
-                      (concat " git blame for " (buffer-name))))
-          (args '("--incremental" "--contents" "-")))
-      (if startline
-          (setq args (append args
-                             (list "-L" (format "%d,%d" startline endline)))))
-      (setq args (append args
-                         (list (file-name-nondirectory buffer-file-name))))
-      (setq git-blame-proc
-            (apply 'start-process
-                   "git-blame" blame-buf
-                   "git" "blame"
-                   args))
-      (with-current-buffer blame-buf
-        (erase-buffer)
-        (make-local-variable 'git-blame-file)
-        (make-local-variable 'git-blame-current)
-        (setq git-blame-file display-buf)
-        (setq git-blame-current nil))
-      (set-process-filter git-blame-proc 'git-blame-filter)
-      (set-process-sentinel git-blame-proc 'git-blame-sentinel)
-      (process-send-region git-blame-proc (point-min) (point-max))
-      (process-send-eof git-blame-proc))))
-
-(defun remove-git-blame-text-properties (start end)
-  (let ((modified (buffer-modified-p))
-        (inhibit-read-only t))
-    (remove-text-properties start end '(point-entered nil))
-    (set-buffer-modified-p modified)))
-
-(defun git-blame-cleanup ()
-  "Remove all blame properties"
-    (mapc 'delete-overlay git-blame-overlays)
-    (setq git-blame-overlays nil)
-    (remove-git-blame-text-properties (point-min) (point-max)))
-
-(defun git-blame-update-region (start end)
-  "Rerun blame to get updates between START and END"
-  (let ((overlays (overlays-in start end)))
-    (while overlays
-      (let ((overlay (pop overlays)))
-        (if (< (overlay-start overlay) start)
-            (setq start (overlay-start overlay)))
-        (if (> (overlay-end overlay) end)
-            (setq end (overlay-end overlay)))
-        (setq git-blame-overlays (delete overlay git-blame-overlays))
-        (delete-overlay overlay))))
-  (remove-git-blame-text-properties start end)
-  ;; We can be sure that start and end are at line breaks
-  (git-blame-run (1+ (count-lines (point-min) start))
-                 (count-lines (point-min) end)))
-
-(defun git-blame-sentinel (proc status)
-  (with-current-buffer (process-buffer proc)
-    (with-current-buffer git-blame-file
-      (setq git-blame-proc nil)
-      (if git-blame-update-queue
-          (git-blame-delayed-update))))
-  ;;(kill-buffer (process-buffer proc))
-  ;;(message "git blame finished")
-  )
-
-(defvar in-blame-filter nil)
-
-(defun git-blame-filter (proc str)
-  (with-current-buffer (process-buffer proc)
-    (save-excursion
-      (goto-char (process-mark proc))
-      (insert-before-markers str)
-      (goto-char (point-min))
-      (unless in-blame-filter
-        (let ((more t)
-              (in-blame-filter t))
-          (while more
-            (setq more (git-blame-parse))))))))
-
-(defun git-blame-parse ()
-  (cond ((looking-at "\\([0-9a-f]\\{40\\}\\) \\([0-9]+\\) \\([0-9]+\\) \\([0-9]+\\)\n")
-         (let ((hash (match-string 1))
-               (src-line (string-to-number (match-string 2)))
-               (res-line (string-to-number (match-string 3)))
-               (num-lines (string-to-number (match-string 4))))
-           (delete-region (point) (match-end 0))
-           (setq git-blame-current (list (git-blame-new-commit hash)
-                                         src-line res-line num-lines)))
-         t)
-        ((looking-at "\\([a-z-]+\\) \\(.+\\)\n")
-         (let ((key (match-string 1))
-               (value (match-string 2)))
-           (delete-region (point) (match-end 0))
-           (git-blame-add-info (car git-blame-current) key value)
-           (when (string= key "filename")
-             (git-blame-create-overlay (car git-blame-current)
-                                       (caddr git-blame-current)
-                                       (cadddr git-blame-current))
-             (setq git-blame-current nil)))
-         t)
-        (t
-         nil)))
-
-(defun git-blame-new-commit (hash)
-  (with-current-buffer git-blame-file
-    (or (gethash hash git-blame-cache)
-        ;; Assign a random color to each new commit info
-        ;; Take care not to select the same color multiple times
-        (let* ((color (if git-blame-colors
-                          (git-blame-random-pop git-blame-colors)
-                        git-blame-ancient-color))
-               (info `(,hash (color . ,color))))
-          (puthash hash info git-blame-cache)
-          info))))
-
-(defun git-blame-create-overlay (info start-line num-lines)
-  (with-current-buffer git-blame-file
-    (save-excursion
-      (let ((inhibit-point-motion-hooks t)
-            (inhibit-modification-hooks t))
-        (goto-char (point-min))
-        (forward-line (1- start-line))
-        (let* ((start (point))
-               (end (progn (forward-line num-lines) (point)))
-               (ovl (make-overlay start end))
-               (hash (car info))
-               (spec `((?h . ,(substring hash 0 6))
-                       (?H . ,hash)
-                       (?a . ,(git-blame-get-info info 'author))
-                       (?A . ,(git-blame-get-info info 'author-mail))
-                       (?c . ,(git-blame-get-info info 'committer))
-                       (?C . ,(git-blame-get-info info 'committer-mail))
-                       (?s . ,(git-blame-get-info info 'summary)))))
-          (push ovl git-blame-overlays)
-          (overlay-put ovl 'git-blame info)
-          (overlay-put ovl 'help-echo
-                       (format-spec git-blame-mouseover-format spec))
-          (if git-blame-use-colors
-              (overlay-put ovl 'face (list :background
-                                           (cdr (assq 'color (cdr info))))))
-          (overlay-put ovl 'line-prefix
-                       (propertize (format-spec git-blame-prefix-format spec)
-                                   'face 'git-blame-prefix-face)))))))
-
-(defun git-blame-add-info (info key value)
-  (nconc info (list (cons (intern key) value))))
-
-(defun git-blame-get-info (info key)
-  (cdr (assq key (cdr info))))
-
-(defun git-blame-current-commit ()
-  (let ((info (get-char-property (point) 'git-blame)))
-    (if info
-        (car info)
-      (error "No commit info"))))
-
-(defun git-describe-commit (hash)
-  (with-temp-buffer
-    (call-process "git" nil t nil
-                  "log" "-1"
-		  (concat "--pretty=" git-blame-log-oneline-format)
-                  hash)
-    (buffer-substring (point-min) (point-max))))
-
-(defvar git-blame-last-identification nil)
-(make-variable-buffer-local 'git-blame-last-identification)
-(defun git-blame-identify (&optional hash)
-  (interactive)
-  (let ((info (gethash (or hash (git-blame-current-commit)) git-blame-cache)))
-    (when (and info (not (eq info git-blame-last-identification)))
-      (message "%s" (nth 4 info))
-      (setq git-blame-last-identification info))))
-
-;; (defun git-blame-after-save ()
-;;   (when git-blame-mode
-;;     (git-blame-cleanup)
-;;     (git-blame-run)))
-;; (add-hook 'after-save-hook 'git-blame-after-save)
-
-(defun git-blame-after-change (start end length)
-  (when git-blame-mode
-    (git-blame-enq-update start end)))
-
-(defvar git-blame-last-update nil)
-(make-variable-buffer-local 'git-blame-last-update)
-(defun git-blame-enq-update (start end)
-  "Mark the region between START and END as needing blame update"
-  ;; Try to be smart and avoid multiple callouts for sequential
-  ;; editing
-  (cond ((and git-blame-last-update
-              (= start (cdr git-blame-last-update)))
-         (setcdr git-blame-last-update end))
-        ((and git-blame-last-update
-              (= end (car git-blame-last-update)))
-         (setcar git-blame-last-update start))
-        (t
-         (setq git-blame-last-update (cons start end))
-         (setq git-blame-update-queue (nconc git-blame-update-queue
-                                             (list git-blame-last-update)))))
-  (unless (or git-blame-proc git-blame-idle-timer)
-    (setq git-blame-idle-timer
-          (run-with-idle-timer 0.5 nil 'git-blame-delayed-update))))
-
-(defun git-blame-delayed-update ()
-  (setq git-blame-idle-timer nil)
-  (if git-blame-update-queue
-      (let ((first (pop git-blame-update-queue))
-            (inhibit-point-motion-hooks t))
-        (git-blame-update-region (car first) (cdr first)))))
-
-(provide 'git-blame)
-
-;;; git-blame.el ends here
diff --git a/contrib/emacs/git.el b/contrib/emacs/git.el
deleted file mode 100644
index 5ffc506..0000000
--- a/contrib/emacs/git.el
+++ /dev/null
@@ -1,1705 +0,0 @@
-;;; git.el --- A user interface for git
-
-;; Copyright (C) 2005, 2006, 2007, 2008, 2009 Alexandre Julliard <julliard@winehq.org>
-
-;; Version: 1.0
-
-;; 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., 59 Temple Place, Suite 330, Boston,
-;; MA 02111-1307 USA
-
-;;; Commentary:
-
-;; This file contains an interface for the git version control
-;; system. It provides easy access to the most frequently used git
-;; commands. The user interface is as far as possible identical to
-;; that of the PCL-CVS mode.
-;;
-;; To install: put this file on the load-path and place the following
-;; in your .emacs file:
-;;
-;;    (require 'git)
-;;
-;; To start: `M-x git-status'
-;;
-;; TODO
-;;  - diff against other branch
-;;  - renaming files from the status buffer
-;;  - creating tags
-;;  - fetch/pull
-;;  - revlist browser
-;;  - git-show-branch browser
-;;
-
-;;; Compatibility:
-;;
-;; This file works on GNU Emacs 21 or later. It may work on older
-;; versions but this is not guaranteed.
-;;
-;; It may work on XEmacs 21, provided that you first install the ewoc
-;; and log-edit packages.
-;;
-
-(eval-when-compile (require 'cl))
-(require 'ewoc)
-(require 'log-edit)
-(require 'easymenu)
-
-
-;;;; Customizations
-;;;; ------------------------------------------------------------
-
-(defgroup git nil
-  "A user interface for the git versioning system."
-  :group 'tools)
-
-(defcustom git-committer-name nil
-  "User name to use for commits.
-The default is to fall back to the repository config,
-then to `add-log-full-name' and then to `user-full-name'."
-  :group 'git
-  :type '(choice (const :tag "Default" nil)
-                 (string :tag "Name")))
-
-(defcustom git-committer-email nil
-  "Email address to use for commits.
-The default is to fall back to the git repository config,
-then to `add-log-mailing-address' and then to `user-mail-address'."
-  :group 'git
-  :type '(choice (const :tag "Default" nil)
-                 (string :tag "Email")))
-
-(defcustom git-commits-coding-system nil
-  "Default coding system for the log message of git commits."
-  :group 'git
-  :type '(choice (const :tag "From repository config" nil)
-                 (coding-system)))
-
-(defcustom git-append-signed-off-by nil
-  "Whether to append a Signed-off-by line to the commit message before editing."
-  :group 'git
-  :type 'boolean)
-
-(defcustom git-reuse-status-buffer t
-  "Whether `git-status' should try to reuse an existing buffer
-if there is already one that displays the same directory."
-  :group 'git
-  :type 'boolean)
-
-(defcustom git-per-dir-ignore-file ".gitignore"
-  "Name of the per-directory ignore file."
-  :group 'git
-  :type 'string)
-
-(defcustom git-show-uptodate nil
-  "Whether to display up-to-date files."
-  :group 'git
-  :type 'boolean)
-
-(defcustom git-show-ignored nil
-  "Whether to display ignored files."
-  :group 'git
-  :type 'boolean)
-
-(defcustom git-show-unknown t
-  "Whether to display unknown files."
-  :group 'git
-  :type 'boolean)
-
-
-(defface git-status-face
-  '((((class color) (background light)) (:foreground "purple"))
-    (((class color) (background dark)) (:foreground "salmon")))
-  "Git mode face used to highlight added and modified files."
-  :group 'git)
-
-(defface git-unmerged-face
-  '((((class color) (background light)) (:foreground "red" :bold t))
-    (((class color) (background dark)) (:foreground "red" :bold t)))
-  "Git mode face used to highlight unmerged files."
-  :group 'git)
-
-(defface git-unknown-face
-  '((((class color) (background light)) (:foreground "goldenrod" :bold t))
-    (((class color) (background dark)) (:foreground "goldenrod" :bold t)))
-  "Git mode face used to highlight unknown files."
-  :group 'git)
-
-(defface git-uptodate-face
-  '((((class color) (background light)) (:foreground "grey60"))
-    (((class color) (background dark)) (:foreground "grey40")))
-  "Git mode face used to highlight up-to-date files."
-  :group 'git)
-
-(defface git-ignored-face
-  '((((class color) (background light)) (:foreground "grey60"))
-    (((class color) (background dark)) (:foreground "grey40")))
-  "Git mode face used to highlight ignored files."
-  :group 'git)
-
-(defface git-mark-face
-  '((((class color) (background light)) (:foreground "red" :bold t))
-    (((class color) (background dark)) (:foreground "tomato" :bold t)))
-  "Git mode face used for the file marks."
-  :group 'git)
-
-(defface git-header-face
-  '((((class color) (background light)) (:foreground "blue"))
-    (((class color) (background dark)) (:foreground "blue")))
-  "Git mode face used for commit headers."
-  :group 'git)
-
-(defface git-separator-face
-  '((((class color) (background light)) (:foreground "brown"))
-    (((class color) (background dark)) (:foreground "brown")))
-  "Git mode face used for commit separator."
-  :group 'git)
-
-(defface git-permission-face
-  '((((class color) (background light)) (:foreground "green" :bold t))
-    (((class color) (background dark)) (:foreground "green" :bold t)))
-  "Git mode face used for permission changes."
-  :group 'git)
-
-
-;;;; Utilities
-;;;; ------------------------------------------------------------
-
-(defconst git-log-msg-separator "--- log message follows this line ---")
-
-(defvar git-log-edit-font-lock-keywords
-  `(("^\\(Author:\\|Date:\\|Merge:\\|Signed-off-by:\\)\\(.*\\)$"
-     (1 font-lock-keyword-face)
-     (2 font-lock-function-name-face))
-    (,(concat "^\\(" (regexp-quote git-log-msg-separator) "\\)$")
-     (1 font-lock-comment-face))))
-
-(defun git-get-env-strings (env)
-  "Build a list of NAME=VALUE strings from a list of environment strings."
-  (mapcar (lambda (entry) (concat (car entry) "=" (cdr entry))) env))
-
-(defun git-call-process (buffer &rest args)
-  "Wrapper for call-process that sets environment strings."
-  (apply #'call-process "git" nil buffer nil args))
-
-(defun git-call-process-display-error (&rest args)
-  "Wrapper for call-process that displays error messages."
-  (let* ((dir default-directory)
-         (buffer (get-buffer-create "*Git Command Output*"))
-         (ok (with-current-buffer buffer
-               (let ((default-directory dir)
-                     (buffer-read-only nil))
-                 (erase-buffer)
-                 (eq 0 (apply #'git-call-process (list buffer t) args))))))
-    (unless ok (display-message-or-buffer buffer))
-    ok))
-
-(defun git-call-process-string (&rest args)
-  "Wrapper for call-process that returns the process output as a string,
-or nil if the git command failed."
-  (with-temp-buffer
-    (and (eq 0 (apply #'git-call-process t args))
-         (buffer-string))))
-
-(defun git-call-process-string-display-error (&rest args)
-  "Wrapper for call-process that displays error message and returns
-the process output as a string, or nil if the git command failed."
-  (with-temp-buffer
-    (if (eq 0 (apply #'git-call-process (list t t) args))
-        (buffer-string)
-      (display-message-or-buffer (current-buffer))
-      nil)))
-
-(defun git-run-process-region (buffer start end program args)
-  "Run a git process with a buffer region as input."
-  (let ((output-buffer (current-buffer))
-        (dir default-directory))
-    (with-current-buffer buffer
-      (cd dir)
-      (apply #'call-process-region start end program
-             nil (list output-buffer t) nil args))))
-
-(defun git-run-command-buffer (buffer-name &rest args)
-  "Run a git command, sending the output to a buffer named BUFFER-NAME."
-  (let ((dir default-directory)
-        (buffer (get-buffer-create buffer-name)))
-    (message "Running git %s..." (car args))
-    (with-current-buffer buffer
-      (let ((default-directory dir)
-            (buffer-read-only nil))
-        (erase-buffer)
-        (apply #'git-call-process buffer args)))
-    (message "Running git %s...done" (car args))
-    buffer))
-
-(defun git-run-command-region (buffer start end env &rest args)
-  "Run a git command with specified buffer region as input."
-  (with-temp-buffer
-    (if (eq 0 (if env
-                  (git-run-process-region
-                   buffer start end "env"
-                   (append (git-get-env-strings env) (list "git") args))
-                (git-run-process-region buffer start end "git" args)))
-        (buffer-string)
-      (display-message-or-buffer (current-buffer))
-      nil)))
-
-(defun git-run-hook (hook env &rest args)
-  "Run a git hook and display its output if any."
-  (let ((dir default-directory)
-        (hook-name (expand-file-name (concat ".git/hooks/" hook))))
-    (or (not (file-executable-p hook-name))
-        (let (status (buffer (get-buffer-create "*Git Hook Output*")))
-          (with-current-buffer buffer
-            (erase-buffer)
-            (cd dir)
-            (setq status
-                  (if env
-                      (apply #'call-process "env" nil (list buffer t) nil
-                             (append (git-get-env-strings env) (list hook-name) args))
-                    (apply #'call-process hook-name nil (list buffer t) nil args))))
-          (display-message-or-buffer buffer)
-          (eq 0 status)))))
-
-(defun git-get-string-sha1 (string)
-  "Read a SHA1 from the specified string."
-  (and string
-       (string-match "[0-9a-f]\\{40\\}" string)
-       (match-string 0 string)))
-
-(defun git-get-committer-name ()
-  "Return the name to use as GIT_COMMITTER_NAME."
-  ; copied from log-edit
-  (or git-committer-name
-      (git-config "user.name")
-      (and (boundp 'add-log-full-name) add-log-full-name)
-      (and (fboundp 'user-full-name) (user-full-name))
-      (and (boundp 'user-full-name) user-full-name)))
-
-(defun git-get-committer-email ()
-  "Return the email address to use as GIT_COMMITTER_EMAIL."
-  ; copied from log-edit
-  (or git-committer-email
-      (git-config "user.email")
-      (and (boundp 'add-log-mailing-address) add-log-mailing-address)
-      (and (fboundp 'user-mail-address) (user-mail-address))
-      (and (boundp 'user-mail-address) user-mail-address)))
-
-(defun git-get-commits-coding-system ()
-  "Return the coding system to use for commits."
-  (let ((repo-config (git-config "i18n.commitencoding")))
-    (or git-commits-coding-system
-        (and repo-config
-             (fboundp 'locale-charset-to-coding-system)
-             (locale-charset-to-coding-system repo-config))
-      'utf-8)))
-
-(defun git-get-logoutput-coding-system ()
-  "Return the coding system used for git-log output."
-  (let ((repo-config (or (git-config "i18n.logoutputencoding")
-                         (git-config "i18n.commitencoding"))))
-    (or git-commits-coding-system
-        (and repo-config
-             (fboundp 'locale-charset-to-coding-system)
-             (locale-charset-to-coding-system repo-config))
-      'utf-8)))
-
-(defun git-escape-file-name (name)
-  "Escape a file name if necessary."
-  (if (string-match "[\n\t\"\\]" name)
-      (concat "\""
-              (mapconcat (lambda (c)
-                   (case c
-                     (?\n "\\n")
-                     (?\t "\\t")
-                     (?\\ "\\\\")
-                     (?\" "\\\"")
-                     (t (char-to-string c))))
-                 name "")
-              "\"")
-    name))
-
-(defun git-success-message (text files)
-  "Print a success message after having handled FILES."
-  (let ((n (length files)))
-    (if (equal n 1)
-        (message "%s %s" text (car files))
-      (message "%s %d files" text n))))
-
-(defun git-get-top-dir (dir)
-  "Retrieve the top-level directory of a git tree."
-  (let ((cdup (with-output-to-string
-                (with-current-buffer standard-output
-                  (cd dir)
-                  (unless (eq 0 (git-call-process t "rev-parse" "--show-cdup"))
-                    (error "cannot find top-level git tree for %s." dir))))))
-    (expand-file-name (concat (file-name-as-directory dir)
-                              (car (split-string cdup "\n"))))))
-
-;stolen from pcl-cvs
-(defun git-append-to-ignore (file)
-  "Add a file name to the ignore file in its directory."
-  (let* ((fullname (expand-file-name file))
-         (dir (file-name-directory fullname))
-         (name (file-name-nondirectory fullname))
-         (ignore-name (expand-file-name git-per-dir-ignore-file dir))
-         (created (not (file-exists-p ignore-name))))
-  (save-window-excursion
-    (set-buffer (find-file-noselect ignore-name))
-    (goto-char (point-max))
-    (unless (zerop (current-column)) (insert "\n"))
-    (insert "/" name "\n")
-    (sort-lines nil (point-min) (point-max))
-    (save-buffer))
-  (when created
-    (git-call-process nil "update-index" "--add" "--" (file-relative-name ignore-name)))
-  (git-update-status-files (list (file-relative-name ignore-name)))))
-
-; propertize definition for XEmacs, stolen from erc-compat
-(eval-when-compile
-  (unless (fboundp 'propertize)
-    (defun propertize (string &rest props)
-      (let ((string (copy-sequence string)))
-        (while props
-          (put-text-property 0 (length string) (nth 0 props) (nth 1 props) string)
-          (setq props (cddr props)))
-        string))))
-
-;;;; Wrappers for basic git commands
-;;;; ------------------------------------------------------------
-
-(defun git-rev-parse (rev)
-  "Parse a revision name and return its SHA1."
-  (git-get-string-sha1
-   (git-call-process-string "rev-parse" rev)))
-
-(defun git-config (key)
-  "Retrieve the value associated to KEY in the git repository config file."
-  (let ((str (git-call-process-string "config" key)))
-    (and str (car (split-string str "\n")))))
-
-(defun git-symbolic-ref (ref)
-  "Wrapper for the git-symbolic-ref command."
-  (let ((str (git-call-process-string "symbolic-ref" ref)))
-    (and str (car (split-string str "\n")))))
-
-(defun git-update-ref (ref newval &optional oldval reason)
-  "Update a reference by calling git-update-ref."
-  (let ((args (and oldval (list oldval))))
-    (when newval (push newval args))
-    (push ref args)
-    (when reason
-     (push reason args)
-     (push "-m" args))
-    (unless newval (push "-d" args))
-    (apply 'git-call-process-display-error "update-ref" args)))
-
-(defun git-for-each-ref (&rest specs)
-  "Return a list of refs using git-for-each-ref.
-Each entry is a cons of (SHORT-NAME . FULL-NAME)."
-  (let (refs)
-    (with-temp-buffer
-      (apply #'git-call-process t "for-each-ref" "--format=%(refname)" specs)
-      (goto-char (point-min))
-      (while (re-search-forward "^[^/\n]+/[^/\n]+/\\(.+\\)$" nil t)
-	(push (cons (match-string 1) (match-string 0)) refs)))
-    (nreverse refs)))
-
-(defun git-read-tree (tree &optional index-file)
-  "Read a tree into the index file."
-  (let ((process-environment
-         (append (and index-file (list (concat "GIT_INDEX_FILE=" index-file))) process-environment)))
-    (apply 'git-call-process-display-error "read-tree" (if tree (list tree)))))
-
-(defun git-write-tree (&optional index-file)
-  "Call git-write-tree and return the resulting tree SHA1 as a string."
-  (let ((process-environment
-         (append (and index-file (list (concat "GIT_INDEX_FILE=" index-file))) process-environment)))
-    (git-get-string-sha1
-     (git-call-process-string-display-error "write-tree"))))
-
-(defun git-commit-tree (buffer tree parent)
-  "Create a commit and possibly update HEAD.
-Create a commit with the message in BUFFER using the tree with hash TREE.
-Use PARENT as the parent of the new commit. If PARENT is the current \"HEAD\",
-update the \"HEAD\" reference to the new commit."
-  (let ((author-name (git-get-committer-name))
-        (author-email (git-get-committer-email))
-        (subject "commit (initial): ")
-        author-date log-start log-end args coding-system-for-write)
-    (when parent
-      (setq subject "commit: ")
-      (push "-p" args)
-      (push parent args))
-    (with-current-buffer buffer
-      (goto-char (point-min))
-      (if
-          (setq log-start (re-search-forward (concat "^" (regexp-quote git-log-msg-separator) "\n") nil t))
-          (save-restriction
-            (narrow-to-region (point-min) log-start)
-            (goto-char (point-min))
-            (when (re-search-forward "^Author: +\\(.*?\\) *<\\(.*\\)> *$" nil t)
-              (setq author-name (match-string 1)
-                    author-email (match-string 2)))
-            (goto-char (point-min))
-            (when (re-search-forward "^Date: +\\(.*\\)$" nil t)
-              (setq author-date (match-string 1)))
-            (goto-char (point-min))
-            (when (re-search-forward "^Merge: +\\(.*\\)" nil t)
-              (setq subject "commit (merge): ")
-              (dolist (parent (split-string (match-string 1) " +" t))
-                (push "-p" args)
-                (push parent args))))
-        (setq log-start (point-min)))
-      (setq log-end (point-max))
-      (goto-char log-start)
-      (when (re-search-forward ".*$" nil t)
-        (setq subject (concat subject (match-string 0))))
-      (setq coding-system-for-write buffer-file-coding-system))
-    (let ((commit
-           (git-get-string-sha1
-            (let ((env `(("GIT_AUTHOR_NAME" . ,author-name)
-                         ("GIT_AUTHOR_EMAIL" . ,author-email)
-                         ("GIT_COMMITTER_NAME" . ,(git-get-committer-name))
-                         ("GIT_COMMITTER_EMAIL" . ,(git-get-committer-email)))))
-              (when author-date (push `("GIT_AUTHOR_DATE" . ,author-date) env))
-              (apply #'git-run-command-region
-                     buffer log-start log-end env
-                     "commit-tree" tree (nreverse args))))))
-      (when commit (git-update-ref "HEAD" commit parent subject))
-      commit)))
-
-(defun git-empty-db-p ()
-  "Check if the git db is empty (no commit done yet)."
-  (not (eq 0 (git-call-process nil "rev-parse" "--verify" "HEAD"))))
-
-(defun git-get-merge-heads ()
-  "Retrieve the merge heads from the MERGE_HEAD file if present."
-  (let (heads)
-    (when (file-readable-p ".git/MERGE_HEAD")
-      (with-temp-buffer
-        (insert-file-contents ".git/MERGE_HEAD" nil nil nil t)
-        (goto-char (point-min))
-        (while (re-search-forward "[0-9a-f]\\{40\\}" nil t)
-          (push (match-string 0) heads))))
-    (nreverse heads)))
-
-(defun git-get-commit-description (commit)
-  "Get a one-line description of COMMIT."
-  (let ((coding-system-for-read (git-get-logoutput-coding-system)))
-    (let ((descr (git-call-process-string "log" "--max-count=1" "--pretty=oneline" commit)))
-      (if (and descr (string-match "\\`\\([0-9a-f]\\{40\\}\\) *\\(.*\\)$" descr))
-          (concat (substring (match-string 1 descr) 0 10) " - " (match-string 2 descr))
-        descr))))
-
-;;;; File info structure
-;;;; ------------------------------------------------------------
-
-; fileinfo structure stolen from pcl-cvs
-(defstruct (git-fileinfo
-            (:copier nil)
-            (:constructor git-create-fileinfo (state name &optional old-perm new-perm rename-state orig-name marked))
-            (:conc-name git-fileinfo->))
-  marked              ;; t/nil
-  state               ;; current state
-  name                ;; file name
-  old-perm new-perm   ;; permission flags
-  rename-state        ;; rename or copy state
-  orig-name           ;; original name for renames or copies
-  needs-update        ;; whether file needs to be updated
-  needs-refresh)      ;; whether file needs to be refreshed
-
-(defvar git-status nil)
-
-(defun git-set-fileinfo-state (info state)
-  "Set the state of a file info."
-  (unless (eq (git-fileinfo->state info) state)
-    (setf (git-fileinfo->state info) state
-	  (git-fileinfo->new-perm info) (git-fileinfo->old-perm info)
-          (git-fileinfo->rename-state info) nil
-          (git-fileinfo->orig-name info) nil
-          (git-fileinfo->needs-update info) nil
-          (git-fileinfo->needs-refresh info) t)))
-
-(defun git-status-filenames-map (status func files &rest args)
-  "Apply FUNC to the status files names in the FILES list.
-The list must be sorted."
-  (when files
-    (let ((file (pop files))
-          (node (ewoc-nth status 0)))
-      (while (and file node)
-        (let* ((info (ewoc-data node))
-               (name (git-fileinfo->name info)))
-          (if (string-lessp name file)
-              (setq node (ewoc-next status node))
-            (if (string-equal name file)
-                (apply func info args))
-            (setq file (pop files))))))))
-
-(defun git-set-filenames-state (status files state)
-  "Set the state of a list of named files. The list must be sorted"
-  (when files
-    (git-status-filenames-map status #'git-set-fileinfo-state files state)
-    (unless state  ;; delete files whose state has been set to nil
-      (ewoc-filter status (lambda (info) (git-fileinfo->state info))))))
-
-(defun git-state-code (code)
-  "Convert from a string to a added/deleted/modified state."
-  (case (string-to-char code)
-    (?M 'modified)
-    (?? 'unknown)
-    (?A 'added)
-    (?D 'deleted)
-    (?U 'unmerged)
-    (?T 'modified)
-    (t nil)))
-
-(defun git-status-code-as-string (code)
-  "Format a git status code as string."
-  (case code
-    ('modified (propertize "Modified" 'face 'git-status-face))
-    ('unknown  (propertize "Unknown " 'face 'git-unknown-face))
-    ('added    (propertize "Added   " 'face 'git-status-face))
-    ('deleted  (propertize "Deleted " 'face 'git-status-face))
-    ('unmerged (propertize "Unmerged" 'face 'git-unmerged-face))
-    ('uptodate (propertize "Uptodate" 'face 'git-uptodate-face))
-    ('ignored  (propertize "Ignored " 'face 'git-ignored-face))
-    (t "?       ")))
-
-(defun git-file-type-as-string (old-perm new-perm)
-  "Return a string describing the file type based on its permissions."
-  (let* ((old-type (lsh (or old-perm 0) -9))
-	 (new-type (lsh (or new-perm 0) -9))
-	 (str (case new-type
-		(64  ;; file
-		 (case old-type
-		   (64 nil)
-		   (80 "   (type change symlink -> file)")
-		   (112 "   (type change subproject -> file)")))
-		 (80  ;; symlink
-		  (case old-type
-		    (64 "   (type change file -> symlink)")
-		    (112 "   (type change subproject -> symlink)")
-		    (t "   (symlink)")))
-		  (112  ;; subproject
-		   (case old-type
-		     (64 "   (type change file -> subproject)")
-		     (80 "   (type change symlink -> subproject)")
-		     (t "   (subproject)")))
-                  (72 nil)  ;; directory (internal, not a real git state)
-		  (0  ;; deleted or unknown
-		   (case old-type
-		     (80 "   (symlink)")
-		     (112 "   (subproject)")))
-		  (t (format "   (unknown type %o)" new-type)))))
-    (cond (str (propertize str 'face 'git-status-face))
-          ((eq new-type 72) "/")
-          (t ""))))
-
-(defun git-rename-as-string (info)
-  "Return a string describing the copy or rename associated with INFO, or an empty string if none."
-  (let ((state (git-fileinfo->rename-state info)))
-    (if state
-        (propertize
-         (concat "   ("
-                 (if (eq state 'copy) "copied from "
-                   (if (eq (git-fileinfo->state info) 'added) "renamed from "
-                     "renamed to "))
-                 (git-escape-file-name (git-fileinfo->orig-name info))
-                 ")") 'face 'git-status-face)
-      "")))
-
-(defun git-permissions-as-string (old-perm new-perm)
-  "Format a permission change as string."
-  (propertize
-   (if (or (not old-perm)
-           (not new-perm)
-           (eq 0 (logand ?\111 (logxor old-perm new-perm))))
-       "  "
-     (if (eq 0 (logand ?\111 old-perm)) "+x" "-x"))
-  'face 'git-permission-face))
-
-(defun git-fileinfo-prettyprint (info)
-  "Pretty-printer for the git-fileinfo structure."
-  (let ((old-perm (git-fileinfo->old-perm info))
-	(new-perm (git-fileinfo->new-perm info)))
-    (insert (concat "   " (if (git-fileinfo->marked info) (propertize "*" 'face 'git-mark-face) " ")
-		    " " (git-status-code-as-string (git-fileinfo->state info))
-		    " " (git-permissions-as-string old-perm new-perm)
-		    "  " (git-escape-file-name (git-fileinfo->name info))
-		    (git-file-type-as-string old-perm new-perm)
-		    (git-rename-as-string info)))))
-
-(defun git-update-node-fileinfo (node info)
-  "Update the fileinfo of the specified node. The names are assumed to match already."
-  (let ((data (ewoc-data node)))
-    (setf
-     ;; preserve the marked flag
-     (git-fileinfo->marked info) (git-fileinfo->marked data)
-     (git-fileinfo->needs-update data) nil)
-    (when (not (equal info data))
-      (setf (git-fileinfo->needs-refresh info) t
-            (ewoc-data node) info))))
-
-(defun git-insert-info-list (status infolist files)
-  "Insert a sorted list of file infos in the status buffer, replacing existing ones if any."
-  (let* ((info (pop infolist))
-         (node (ewoc-nth status 0))
-         (name (and info (git-fileinfo->name info)))
-         remaining)
-    (while info
-      (let ((nodename (and node (git-fileinfo->name (ewoc-data node)))))
-        (while (and files (string-lessp (car files) name))
-          (push (pop files) remaining))
-        (when (and files (string-equal (car files) name))
-          (setq files (cdr files)))
-        (cond ((not nodename)
-               (setq node (ewoc-enter-last status info))
-               (setq info (pop infolist))
-               (setq name (and info (git-fileinfo->name info))))
-              ((string-lessp nodename name)
-               (setq node (ewoc-next status node)))
-              ((string-equal nodename name)
-               ;; preserve the marked flag
-               (git-update-node-fileinfo node info)
-               (setq info (pop infolist))
-               (setq name (and info (git-fileinfo->name info))))
-              (t
-               (setq node (ewoc-enter-before status node info))
-               (setq info (pop infolist))
-               (setq name (and info (git-fileinfo->name info)))))))
-    (nconc (nreverse remaining) files)))
-
-(defun git-run-diff-index (status files)
-  "Run git-diff-index on FILES and parse the results into STATUS.
-Return the list of files that haven't been handled."
-  (let (infolist)
-    (with-temp-buffer
-      (apply #'git-call-process t "diff-index" "-z" "-M" "HEAD" "--" files)
-      (goto-char (point-min))
-      (while (re-search-forward
-	      ":\\([0-7]\\{6\\}\\) \\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} \\(\\([ADMUT]\\)\0\\([^\0]+\\)\\|\\([CR]\\)[0-9]*\0\\([^\0]+\\)\0\\([^\0]+\\)\\)\0"
-              nil t 1)
-        (let ((old-perm (string-to-number (match-string 1) 8))
-              (new-perm (string-to-number (match-string 2) 8))
-              (state (or (match-string 4) (match-string 6)))
-              (name (or (match-string 5) (match-string 7)))
-              (new-name (match-string 8)))
-          (if new-name  ; copy or rename
-              (if (eq ?C (string-to-char state))
-                  (push (git-create-fileinfo 'added new-name old-perm new-perm 'copy name) infolist)
-                (push (git-create-fileinfo 'deleted name 0 0 'rename new-name) infolist)
-                (push (git-create-fileinfo 'added new-name old-perm new-perm 'rename name) infolist))
-            (push (git-create-fileinfo (git-state-code state) name old-perm new-perm) infolist)))))
-    (setq infolist (sort (nreverse infolist)
-                         (lambda (info1 info2)
-                           (string-lessp (git-fileinfo->name info1)
-                                         (git-fileinfo->name info2)))))
-    (git-insert-info-list status infolist files)))
-
-(defun git-find-status-file (status file)
-  "Find a given file in the status ewoc and return its node."
-  (let ((node (ewoc-nth status 0)))
-    (while (and node (not (string= file (git-fileinfo->name (ewoc-data node)))))
-      (setq node (ewoc-next status node)))
-    node))
-
-(defun git-run-ls-files (status files default-state &rest options)
-  "Run git-ls-files on FILES and parse the results into STATUS.
-Return the list of files that haven't been handled."
-  (let (infolist)
-    (with-temp-buffer
-      (apply #'git-call-process t "ls-files" "-z" (append options (list "--") files))
-      (goto-char (point-min))
-      (while (re-search-forward "\\([^\0]*?\\)\\(/?\\)\0" nil t 1)
-        (let ((name (match-string 1)))
-          (push (git-create-fileinfo default-state name 0
-                                     (if (string-equal "/" (match-string 2)) (lsh ?\110 9) 0))
-                infolist))))
-    (setq infolist (nreverse infolist))  ;; assume it is sorted already
-    (git-insert-info-list status infolist files)))
-
-(defun git-run-ls-files-cached (status files default-state)
-  "Run git-ls-files -c on FILES and parse the results into STATUS.
-Return the list of files that haven't been handled."
-  (let (infolist)
-    (with-temp-buffer
-      (apply #'git-call-process t "ls-files" "-z" "-s" "-c" "--" files)
-      (goto-char (point-min))
-      (while (re-search-forward "\\([0-7]\\{6\\}\\) [0-9a-f]\\{40\\} 0\t\\([^\0]+\\)\0" nil t)
-	(let* ((new-perm (string-to-number (match-string 1) 8))
-	       (old-perm (if (eq default-state 'added) 0 new-perm))
-	       (name (match-string 2)))
-	  (push (git-create-fileinfo default-state name old-perm new-perm) infolist))))
-    (setq infolist (nreverse infolist))  ;; assume it is sorted already
-    (git-insert-info-list status infolist files)))
-
-(defun git-run-ls-unmerged (status files)
-  "Run git-ls-files -u on FILES and parse the results into STATUS."
-  (with-temp-buffer
-    (apply #'git-call-process t "ls-files" "-z" "-u" "--" files)
-    (goto-char (point-min))
-    (let (unmerged-files)
-      (while (re-search-forward "[0-7]\\{6\\} [0-9a-f]\\{40\\} [123]\t\\([^\0]+\\)\0" nil t)
-        (push (match-string 1) unmerged-files))
-      (setq unmerged-files (nreverse unmerged-files))  ;; assume it is sorted already
-      (git-set-filenames-state status unmerged-files 'unmerged))))
-
-(defun git-get-exclude-files ()
-  "Get the list of exclude files to pass to git-ls-files."
-  (let (files
-        (config (git-config "core.excludesfile")))
-    (when (file-readable-p ".git/info/exclude")
-      (push ".git/info/exclude" files))
-    (when (and config (file-readable-p config))
-      (push config files))
-    files))
-
-(defun git-run-ls-files-with-excludes (status files default-state &rest options)
-  "Run git-ls-files on FILES with appropriate --exclude-from options."
-  (let ((exclude-files (git-get-exclude-files)))
-    (apply #'git-run-ls-files status files default-state "--directory" "--no-empty-directory"
-           (concat "--exclude-per-directory=" git-per-dir-ignore-file)
-           (append options (mapcar (lambda (f) (concat "--exclude-from=" f)) exclude-files)))))
-
-(defun git-update-status-files (&optional files mark-files)
-  "Update the status of FILES from the index.
-The FILES list must be sorted."
-  (unless git-status (error "Not in git-status buffer."))
-  ;; set the needs-update flag on existing files
-  (if files
-      (git-status-filenames-map
-       git-status (lambda (info) (setf (git-fileinfo->needs-update info) t)) files)
-    (ewoc-map (lambda (info) (setf (git-fileinfo->needs-update info) t) nil) git-status)
-    (git-call-process nil "update-index" "--refresh")
-    (when git-show-uptodate
-      (git-run-ls-files-cached git-status nil 'uptodate)))
-  (let ((remaining-files
-          (if (git-empty-db-p) ; we need some special handling for an empty db
-	      (git-run-ls-files-cached git-status files 'added)
-            (git-run-diff-index git-status files))))
-    (git-run-ls-unmerged git-status files)
-    (when (or remaining-files (and git-show-unknown (not files)))
-      (setq remaining-files (git-run-ls-files-with-excludes git-status remaining-files 'unknown "-o")))
-    (when (or remaining-files (and git-show-ignored (not files)))
-      (setq remaining-files (git-run-ls-files-with-excludes git-status remaining-files 'ignored "-o" "-i")))
-    (unless files
-      (setq remaining-files (git-get-filenames (ewoc-collect git-status #'git-fileinfo->needs-update))))
-    (when remaining-files
-      (setq remaining-files (git-run-ls-files-cached git-status remaining-files 'uptodate)))
-    (git-set-filenames-state git-status remaining-files nil)
-    (when mark-files (git-mark-files git-status files))
-    (git-refresh-files)
-    (git-refresh-ewoc-hf git-status)))
-
-(defun git-mark-files (status files)
-  "Mark all the specified FILES, and unmark the others."
-  (let ((file (and files (pop files)))
-        (node (ewoc-nth status 0)))
-    (while node
-      (let ((info (ewoc-data node)))
-        (if (and file (string-equal (git-fileinfo->name info) file))
-            (progn
-              (unless (git-fileinfo->marked info)
-                (setf (git-fileinfo->marked info) t)
-                (setf (git-fileinfo->needs-refresh info) t))
-              (setq file (pop files))
-              (setq node (ewoc-next status node)))
-          (when (git-fileinfo->marked info)
-            (setf (git-fileinfo->marked info) nil)
-            (setf (git-fileinfo->needs-refresh info) t))
-          (if (and file (string-lessp file (git-fileinfo->name info)))
-              (setq file (pop files))
-            (setq node (ewoc-next status node))))))))
-
-(defun git-marked-files ()
-  "Return a list of all marked files, or if none a list containing just the file at cursor position."
-  (unless git-status (error "Not in git-status buffer."))
-  (or (ewoc-collect git-status (lambda (info) (git-fileinfo->marked info)))
-      (list (ewoc-data (ewoc-locate git-status)))))
-
-(defun git-marked-files-state (&rest states)
-  "Return a sorted list of marked files that are in the specified states."
-  (let ((files (git-marked-files))
-        result)
-    (dolist (info files)
-      (when (memq (git-fileinfo->state info) states)
-        (push info result)))
-    (nreverse result)))
-
-(defun git-refresh-files ()
-  "Refresh all files that need it and clear the needs-refresh flag."
-  (unless git-status (error "Not in git-status buffer."))
-  (ewoc-map
-   (lambda (info)
-     (let ((refresh (git-fileinfo->needs-refresh info)))
-       (setf (git-fileinfo->needs-refresh info) nil)
-       refresh))
-   git-status)
-  ; move back to goal column
-  (when goal-column (move-to-column goal-column)))
-
-(defun git-refresh-ewoc-hf (status)
-  "Refresh the ewoc header and footer."
-  (let ((branch (git-symbolic-ref "HEAD"))
-        (head (if (git-empty-db-p) "Nothing committed yet"
-                (git-get-commit-description "HEAD")))
-        (merge-heads (git-get-merge-heads)))
-    (ewoc-set-hf status
-                 (format "Directory:  %s\nBranch:     %s\nHead:       %s%s\n"
-                         default-directory
-                         (if branch
-                             (if (string-match "^refs/heads/" branch)
-                                 (substring branch (match-end 0))
-                               branch)
-                           "none (detached HEAD)")
-                         head
-                         (if merge-heads
-                             (concat "\nMerging:    "
-                                     (mapconcat (lambda (str) (git-get-commit-description str)) merge-heads "\n            "))
-                           ""))
-                 (if (ewoc-nth status 0) "" "    No changes."))))
-
-(defun git-get-filenames (files)
-  (mapcar (lambda (info) (git-fileinfo->name info)) files))
-
-(defun git-update-index (index-file files)
-  "Run git-update-index on a list of files."
-  (let ((process-environment (append (and index-file (list (concat "GIT_INDEX_FILE=" index-file)))
-                                     process-environment))
-        added deleted modified)
-    (dolist (info files)
-      (case (git-fileinfo->state info)
-        ('added (push info added))
-        ('deleted (push info deleted))
-        ('modified (push info modified))))
-    (and
-     (or (not added) (apply #'git-call-process-display-error "update-index" "--add" "--" (git-get-filenames added)))
-     (or (not deleted) (apply #'git-call-process-display-error "update-index" "--remove" "--" (git-get-filenames deleted)))
-     (or (not modified) (apply #'git-call-process-display-error "update-index" "--" (git-get-filenames modified))))))
-
-(defun git-run-pre-commit-hook ()
-  "Run the pre-commit hook if any."
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((files (git-marked-files-state 'added 'deleted 'modified)))
-    (or (not files)
-        (not (file-executable-p ".git/hooks/pre-commit"))
-        (let ((index-file (make-temp-file "gitidx")))
-          (unwind-protect
-            (let ((head-tree (unless (git-empty-db-p) (git-rev-parse "HEAD^{tree}"))))
-              (git-read-tree head-tree index-file)
-              (git-update-index index-file files)
-              (git-run-hook "pre-commit" `(("GIT_INDEX_FILE" . ,index-file))))
-          (delete-file index-file))))))
-
-(defun git-do-commit ()
-  "Perform the actual commit using the current buffer as log message."
-  (interactive)
-  (let ((buffer (current-buffer))
-        (index-file (make-temp-file "gitidx")))
-    (with-current-buffer log-edit-parent-buffer
-      (if (git-marked-files-state 'unmerged)
-          (message "You cannot commit unmerged files, resolve them first.")
-        (unwind-protect
-            (let ((files (git-marked-files-state 'added 'deleted 'modified))
-                  head tree head-tree)
-              (unless (git-empty-db-p)
-                (setq head (git-rev-parse "HEAD")
-                      head-tree (git-rev-parse "HEAD^{tree}")))
-              (message "Running git commit...")
-              (when
-                  (and
-                   (git-read-tree head-tree index-file)
-                   (git-update-index nil files)         ;update both the default index
-                   (git-update-index index-file files)  ;and the temporary one
-                   (setq tree (git-write-tree index-file)))
-                (if (or (not (string-equal tree head-tree))
-                        (yes-or-no-p "The tree was not modified, do you really want to perform an empty commit? "))
-                    (let ((commit (git-commit-tree buffer tree head)))
-                      (when commit
-                        (condition-case nil (delete-file ".git/MERGE_HEAD") (error nil))
-                        (condition-case nil (delete-file ".git/MERGE_MSG") (error nil))
-                        (with-current-buffer buffer (erase-buffer))
-                        (git-update-status-files (git-get-filenames files))
-                        (git-call-process nil "rerere")
-                        (git-call-process nil "gc" "--auto")
-                        (message "Committed %s." commit)
-                        (git-run-hook "post-commit" nil)))
-                  (message "Commit aborted."))))
-          (delete-file index-file))))))
-
-
-;;;; Interactive functions
-;;;; ------------------------------------------------------------
-
-(defun git-mark-file ()
-  "Mark the file that the cursor is on and move to the next one."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (let* ((pos (ewoc-locate git-status))
-         (info (ewoc-data pos)))
-    (setf (git-fileinfo->marked info) t)
-    (ewoc-invalidate git-status pos)
-    (ewoc-goto-next git-status 1)))
-
-(defun git-unmark-file ()
-  "Unmark the file that the cursor is on and move to the next one."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (let* ((pos (ewoc-locate git-status))
-         (info (ewoc-data pos)))
-    (setf (git-fileinfo->marked info) nil)
-    (ewoc-invalidate git-status pos)
-    (ewoc-goto-next git-status 1)))
-
-(defun git-unmark-file-up ()
-  "Unmark the file that the cursor is on and move to the previous one."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (let* ((pos (ewoc-locate git-status))
-         (info (ewoc-data pos)))
-    (setf (git-fileinfo->marked info) nil)
-    (ewoc-invalidate git-status pos)
-    (ewoc-goto-prev git-status 1)))
-
-(defun git-mark-all ()
-  "Mark all files."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (ewoc-map (lambda (info) (unless (git-fileinfo->marked info)
-                             (setf (git-fileinfo->marked info) t))) git-status)
-  ; move back to goal column after invalidate
-  (when goal-column (move-to-column goal-column)))
-
-(defun git-unmark-all ()
-  "Unmark all files."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (ewoc-map (lambda (info) (when (git-fileinfo->marked info)
-                             (setf (git-fileinfo->marked info) nil)
-                             t)) git-status)
-  ; move back to goal column after invalidate
-  (when goal-column (move-to-column goal-column)))
-
-(defun git-toggle-all-marks ()
-  "Toggle all file marks."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (ewoc-map (lambda (info) (setf (git-fileinfo->marked info) (not (git-fileinfo->marked info))) t) git-status)
-  ; move back to goal column after invalidate
-  (when goal-column (move-to-column goal-column)))
-
-(defun git-next-file (&optional n)
-  "Move the selection down N files."
-  (interactive "p")
-  (unless git-status (error "Not in git-status buffer."))
-  (ewoc-goto-next git-status n))
-
-(defun git-prev-file (&optional n)
-  "Move the selection up N files."
-  (interactive "p")
-  (unless git-status (error "Not in git-status buffer."))
-  (ewoc-goto-prev git-status n))
-
-(defun git-next-unmerged-file (&optional n)
-  "Move the selection down N unmerged files."
-  (interactive "p")
-  (unless git-status (error "Not in git-status buffer."))
-  (let* ((last (ewoc-locate git-status))
-         (node (ewoc-next git-status last)))
-    (while (and node (> n 0))
-      (when (eq 'unmerged (git-fileinfo->state (ewoc-data node)))
-        (setq n (1- n))
-        (setq last node))
-      (setq node (ewoc-next git-status node)))
-    (ewoc-goto-node git-status last)))
-
-(defun git-prev-unmerged-file (&optional n)
-  "Move the selection up N unmerged files."
-  (interactive "p")
-  (unless git-status (error "Not in git-status buffer."))
-  (let* ((last (ewoc-locate git-status))
-         (node (ewoc-prev git-status last)))
-    (while (and node (> n 0))
-      (when (eq 'unmerged (git-fileinfo->state (ewoc-data node)))
-        (setq n (1- n))
-        (setq last node))
-      (setq node (ewoc-prev git-status node)))
-    (ewoc-goto-node git-status last)))
-
-(defun git-insert-file (file)
-  "Insert file(s) into the git-status buffer."
-  (interactive "fInsert file: ")
-  (git-update-status-files (list (file-relative-name file))))
-
-(defun git-add-file ()
-  "Add marked file(s) to the index cache."
-  (interactive)
-  (let ((files (git-get-filenames (git-marked-files-state 'unknown 'ignored 'unmerged))))
-    ;; FIXME: add support for directories
-    (unless files
-      (push (file-relative-name (read-file-name "File to add: " nil nil t)) files))
-    (when (apply 'git-call-process-display-error "update-index" "--add" "--" files)
-      (git-update-status-files files)
-      (git-success-message "Added" files))))
-
-(defun git-ignore-file ()
-  "Add marked file(s) to the ignore list."
-  (interactive)
-  (let ((files (git-get-filenames (git-marked-files-state 'unknown))))
-    (unless files
-      (push (file-relative-name (read-file-name "File to ignore: " nil nil t)) files))
-    (dolist (f files) (git-append-to-ignore f))
-    (git-update-status-files files)
-    (git-success-message "Ignored" files)))
-
-(defun git-remove-file ()
-  "Remove the marked file(s)."
-  (interactive)
-  (let ((files (git-get-filenames (git-marked-files-state 'added 'modified 'unknown 'uptodate 'ignored))))
-    (unless files
-      (push (file-relative-name (read-file-name "File to remove: " nil nil t)) files))
-    (if (yes-or-no-p
-         (if (cdr files)
-             (format "Remove %d files? " (length files))
-           (format "Remove %s? " (car files))))
-        (progn
-          (dolist (name files)
-            (ignore-errors
-              (if (file-directory-p name)
-                  (delete-directory name)
-                (delete-file name))))
-          (when (apply 'git-call-process-display-error "update-index" "--remove" "--" files)
-            (git-update-status-files files)
-            (git-success-message "Removed" files)))
-      (message "Aborting"))))
-
-(defun git-revert-file ()
-  "Revert changes to the marked file(s)."
-  (interactive)
-  (let ((files (git-marked-files-state 'added 'deleted 'modified 'unmerged))
-        added modified)
-    (when (and files
-               (yes-or-no-p
-                (if (cdr files)
-                    (format "Revert %d files? " (length files))
-                  (format "Revert %s? " (git-fileinfo->name (car files))))))
-      (dolist (info files)
-        (case (git-fileinfo->state info)
-          ('added (push (git-fileinfo->name info) added))
-          ('deleted (push (git-fileinfo->name info) modified))
-          ('unmerged (push (git-fileinfo->name info) modified))
-          ('modified (push (git-fileinfo->name info) modified))))
-      ;; check if a buffer contains one of the files and isn't saved
-      (dolist (file modified)
-        (let ((buffer (get-file-buffer file)))
-          (when (and buffer (buffer-modified-p buffer))
-            (error "Buffer %s is modified. Please kill or save modified buffers before reverting." (buffer-name buffer)))))
-      (let ((ok (and
-                 (or (not added)
-                     (apply 'git-call-process-display-error "update-index" "--force-remove" "--" added))
-                 (or (not modified)
-                     (apply 'git-call-process-display-error "checkout" "HEAD" modified))))
-            (names (git-get-filenames files)))
-        (git-update-status-files names)
-        (when ok
-          (dolist (file modified)
-            (let ((buffer (get-file-buffer file)))
-              (when buffer (with-current-buffer buffer (revert-buffer t t t)))))
-          (git-success-message "Reverted" names))))))
-
-(defun git-remove-handled ()
-  "Remove handled files from the status list."
-  (interactive)
-  (ewoc-filter git-status
-               (lambda (info)
-                 (case (git-fileinfo->state info)
-                   ('ignored git-show-ignored)
-                   ('uptodate git-show-uptodate)
-                   ('unknown git-show-unknown)
-                   (t t))))
-  (unless (ewoc-nth git-status 0)  ; refresh header if list is empty
-    (git-refresh-ewoc-hf git-status)))
-
-(defun git-toggle-show-uptodate ()
-  "Toogle the option for showing up-to-date files."
-  (interactive)
-  (if (setq git-show-uptodate (not git-show-uptodate))
-      (git-refresh-status)
-    (git-remove-handled)))
-
-(defun git-toggle-show-ignored ()
-  "Toogle the option for showing ignored files."
-  (interactive)
-  (if (setq git-show-ignored (not git-show-ignored))
-      (progn
-        (message "Inserting ignored files...")
-        (git-run-ls-files-with-excludes git-status nil 'ignored "-o" "-i")
-        (git-refresh-files)
-        (git-refresh-ewoc-hf git-status)
-        (message "Inserting ignored files...done"))
-    (git-remove-handled)))
-
-(defun git-toggle-show-unknown ()
-  "Toogle the option for showing unknown files."
-  (interactive)
-  (if (setq git-show-unknown (not git-show-unknown))
-      (progn
-        (message "Inserting unknown files...")
-        (git-run-ls-files-with-excludes git-status nil 'unknown "-o")
-        (git-refresh-files)
-        (git-refresh-ewoc-hf git-status)
-        (message "Inserting unknown files...done"))
-    (git-remove-handled)))
-
-(defun git-expand-directory (info)
-  "Expand the directory represented by INFO to list its files."
-  (when (eq (lsh (git-fileinfo->new-perm info) -9) ?\110)
-    (let ((dir (git-fileinfo->name info)))
-      (git-set-filenames-state git-status (list dir) nil)
-      (git-run-ls-files-with-excludes git-status (list (concat dir "/")) 'unknown "-o")
-      (git-refresh-files)
-      (git-refresh-ewoc-hf git-status)
-      t)))
-
-(defun git-setup-diff-buffer (buffer)
-  "Setup a buffer for displaying a diff."
-  (let ((dir default-directory))
-    (with-current-buffer buffer
-      (diff-mode)
-      (goto-char (point-min))
-      (setq default-directory dir)
-      (setq buffer-read-only t)))
-  (display-buffer buffer)
-  ; shrink window only if it displays the status buffer
-  (when (eq (window-buffer) (current-buffer))
-    (shrink-window-if-larger-than-buffer)))
-
-(defun git-diff-file ()
-  "Diff the marked file(s) against HEAD."
-  (interactive)
-  (let ((files (git-marked-files)))
-    (git-setup-diff-buffer
-     (apply #'git-run-command-buffer "*git-diff*" "diff-index" "-p" "-M" "HEAD" "--" (git-get-filenames files)))))
-
-(defun git-diff-file-merge-head (arg)
-  "Diff the marked file(s) against the first merge head (or the nth one with a numeric prefix)."
-  (interactive "p")
-  (let ((files (git-marked-files))
-        (merge-heads (git-get-merge-heads)))
-    (unless merge-heads (error "No merge in progress"))
-    (git-setup-diff-buffer
-     (apply #'git-run-command-buffer "*git-diff*" "diff-index" "-p" "-M"
-            (or (nth (1- arg) merge-heads) "HEAD") "--" (git-get-filenames files)))))
-
-(defun git-diff-unmerged-file (stage)
-  "Diff the marked unmerged file(s) against the specified stage."
-  (let ((files (git-marked-files)))
-    (git-setup-diff-buffer
-     (apply #'git-run-command-buffer "*git-diff*" "diff-files" "-p" stage "--" (git-get-filenames files)))))
-
-(defun git-diff-file-base ()
-  "Diff the marked unmerged file(s) against the common base file."
-  (interactive)
-  (git-diff-unmerged-file "-1"))
-
-(defun git-diff-file-mine ()
-  "Diff the marked unmerged file(s) against my pre-merge version."
-  (interactive)
-  (git-diff-unmerged-file "-2"))
-
-(defun git-diff-file-other ()
-  "Diff the marked unmerged file(s) against the other's pre-merge version."
-  (interactive)
-  (git-diff-unmerged-file "-3"))
-
-(defun git-diff-file-combined ()
-  "Do a combined diff of the marked unmerged file(s)."
-  (interactive)
-  (git-diff-unmerged-file "-c"))
-
-(defun git-diff-file-idiff ()
-  "Perform an interactive diff on the current file."
-  (interactive)
-  (let ((files (git-marked-files-state 'added 'deleted 'modified)))
-    (unless (eq 1 (length files))
-      (error "Cannot perform an interactive diff on multiple files."))
-    (let* ((filename (car (git-get-filenames files)))
-           (buff1 (find-file-noselect filename))
-           (buff2 (git-run-command-buffer (concat filename ".~HEAD~") "cat-file" "blob" (concat "HEAD:" filename))))
-      (ediff-buffers buff1 buff2))))
-
-(defun git-log-file ()
-  "Display a log of changes to the marked file(s)."
-  (interactive)
-  (let* ((files (git-marked-files))
-         (coding-system-for-read git-commits-coding-system)
-         (buffer (apply #'git-run-command-buffer "*git-log*" "rev-list" "--pretty" "HEAD" "--" (git-get-filenames files))))
-    (with-current-buffer buffer
-      ; (git-log-mode)  FIXME: implement log mode
-      (goto-char (point-min))
-      (setq buffer-read-only t))
-    (display-buffer buffer)))
-
-(defun git-log-edit-files ()
-  "Return a list of marked files for use in the log-edit buffer."
-  (with-current-buffer log-edit-parent-buffer
-    (git-get-filenames (git-marked-files-state 'added 'deleted 'modified))))
-
-(defun git-log-edit-diff ()
-  "Run a diff of the current files being committed from a log-edit buffer."
-  (with-current-buffer log-edit-parent-buffer
-    (git-diff-file)))
-
-(defun git-append-sign-off (name email)
-  "Append a Signed-off-by entry to the current buffer, avoiding duplicates."
-  (let ((sign-off (format "Signed-off-by: %s <%s>" name email))
-        (case-fold-search t))
-    (goto-char (point-min))
-    (unless (re-search-forward (concat "^" (regexp-quote sign-off)) nil t)
-      (goto-char (point-min))
-      (unless (re-search-forward "^Signed-off-by: " nil t)
-        (setq sign-off (concat "\n" sign-off)))
-      (goto-char (point-max))
-      (insert sign-off "\n"))))
-
-(defun git-setup-log-buffer (buffer &optional merge-heads author-name author-email subject date msg)
-  "Setup the log buffer for a commit."
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((dir default-directory)
-        (committer-name (git-get-committer-name))
-        (committer-email (git-get-committer-email))
-        (sign-off git-append-signed-off-by))
-    (with-current-buffer buffer
-      (cd dir)
-      (erase-buffer)
-      (insert
-       (propertize
-        (format "Author: %s <%s>\n%s%s"
-                (or author-name committer-name)
-                (or author-email committer-email)
-                (if date (format "Date: %s\n" date) "")
-                (if merge-heads
-                    (format "Merge: %s\n"
-                            (mapconcat 'identity merge-heads " "))
-                  ""))
-        'face 'git-header-face)
-       (propertize git-log-msg-separator 'face 'git-separator-face)
-       "\n")
-      (when subject (insert subject "\n\n"))
-      (cond (msg (insert msg "\n"))
-            ((file-readable-p ".git/rebase-apply/msg")
-             (insert-file-contents ".git/rebase-apply/msg"))
-            ((file-readable-p ".git/MERGE_MSG")
-             (insert-file-contents ".git/MERGE_MSG")))
-      ; delete empty lines at end
-      (goto-char (point-min))
-      (when (re-search-forward "\n+\\'" nil t)
-        (replace-match "\n" t t))
-      (when sign-off (git-append-sign-off committer-name committer-email)))
-    buffer))
-
-(define-derived-mode git-log-edit-mode log-edit-mode "Git-Log-Edit"
-  "Major mode for editing git log messages.
-
-Set up git-specific `font-lock-keywords' for `log-edit-mode'."
-  (set (make-local-variable 'font-lock-defaults)
-       '(git-log-edit-font-lock-keywords t t)))
-
-(defun git-commit-file ()
-  "Commit the marked file(s), asking for a commit message."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (when (git-run-pre-commit-hook)
-    (let ((buffer (get-buffer-create "*git-commit*"))
-          (coding-system (git-get-commits-coding-system))
-          author-name author-email subject date)
-      (when (eq 0 (buffer-size buffer))
-        (when (file-readable-p ".git/rebase-apply/info")
-          (with-temp-buffer
-            (insert-file-contents ".git/rebase-apply/info")
-            (goto-char (point-min))
-            (when (re-search-forward "^Author: \\(.*\\)\nEmail: \\(.*\\)$" nil t)
-              (setq author-name (match-string 1))
-              (setq author-email (match-string 2)))
-            (goto-char (point-min))
-            (when (re-search-forward "^Subject: \\(.*\\)$" nil t)
-              (setq subject (match-string 1)))
-            (goto-char (point-min))
-            (when (re-search-forward "^Date: \\(.*\\)$" nil t)
-              (setq date (match-string 1)))))
-        (git-setup-log-buffer buffer (git-get-merge-heads) author-name author-email subject date))
-      (if (boundp 'log-edit-diff-function)
-	  (log-edit 'git-do-commit nil '((log-edit-listfun . git-log-edit-files)
-					 (log-edit-diff-function . git-log-edit-diff)) buffer 'git-log-edit-mode)
-	(log-edit 'git-do-commit nil 'git-log-edit-files buffer
-                  'git-log-edit-mode))
-      (setq paragraph-separate (concat (regexp-quote git-log-msg-separator) "$\\|Author: \\|Date: \\|Merge: \\|Signed-off-by: \\|\f\\|[ 	]*$"))
-      (setq buffer-file-coding-system coding-system)
-      (re-search-forward (regexp-quote (concat git-log-msg-separator "\n")) nil t))))
-
-(defun git-setup-commit-buffer (commit)
-  "Setup the commit buffer with the contents of COMMIT."
-  (let (parents author-name author-email subject date msg)
-    (with-temp-buffer
-      (let ((coding-system (git-get-logoutput-coding-system)))
-        (git-call-process t "log" "-1" "--pretty=medium" "--abbrev=40" commit)
-        (goto-char (point-min))
-        (when (re-search-forward "^Merge: *\\(.*\\)$" nil t)
-          (setq parents (cdr (split-string (match-string 1) " +"))))
-        (when (re-search-forward "^Author: *\\(.*\\) <\\(.*\\)>$" nil t)
-          (setq author-name (match-string 1))
-          (setq author-email (match-string 2)))
-        (when (re-search-forward "^Date: *\\(.*\\)$" nil t)
-          (setq date (match-string 1)))
-        (while (re-search-forward "^    \\(.*\\)$" nil t)
-          (push (match-string 1) msg))
-        (setq msg (nreverse msg))
-        (setq subject (pop msg))
-        (while (and msg (zerop (length (car msg))) (pop msg)))))
-    (git-setup-log-buffer (get-buffer-create "*git-commit*")
-                          parents author-name author-email subject date
-                          (mapconcat #'identity msg "\n"))))
-
-(defun git-get-commit-files (commit)
-  "Retrieve a sorted list of files modified by COMMIT."
-  (let (files)
-    (with-temp-buffer
-      (git-call-process t "diff-tree" "-m" "-r" "-z" "--name-only" "--no-commit-id" "--root" commit)
-      (goto-char (point-min))
-      (while (re-search-forward "\\([^\0]*\\)\0" nil t 1)
-        (push (match-string 1) files)))
-    (sort files #'string-lessp)))
-
-(defun git-read-commit-name (prompt &optional default)
-  "Ask for a commit name, with completion for local branch, remote branch and tag."
-  (completing-read prompt
-                   (list* "HEAD" "ORIG_HEAD" "FETCH_HEAD" (mapcar #'car (git-for-each-ref)))
-		   nil nil nil nil default))
-
-(defun git-checkout (branch &optional merge)
-  "Checkout a branch, tag, or any commit.
-Use a prefix arg if git should merge while checking out."
-  (interactive
-   (list (git-read-commit-name "Checkout: ")
-         current-prefix-arg))
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((args (list branch "--")))
-    (when merge (push "-m" args))
-    (when (apply #'git-call-process-display-error "checkout" args)
-      (git-update-status-files))))
-
-(defun git-branch (branch)
-  "Create a branch from the current HEAD and switch to it."
-  (interactive (list (git-read-commit-name "Branch: ")))
-  (unless git-status (error "Not in git-status buffer."))
-  (if (git-rev-parse (concat "refs/heads/" branch))
-      (if (yes-or-no-p (format "Branch %s already exists, replace it? " branch))
-          (and (git-call-process-display-error "branch" "-f" branch)
-               (git-call-process-display-error "checkout" branch))
-        (message "Canceled."))
-    (git-call-process-display-error "checkout" "-b" branch))
-    (git-refresh-ewoc-hf git-status))
-
-(defun git-amend-commit ()
-  "Undo the last commit on HEAD, and set things up to commit an
-amended version of it."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (when (git-empty-db-p) (error "No commit to amend."))
-  (let* ((commit (git-rev-parse "HEAD"))
-         (files (git-get-commit-files commit)))
-    (when (if (git-rev-parse "HEAD^")
-              (git-call-process-display-error "reset" "--soft" "HEAD^")
-            (and (git-update-ref "ORIG_HEAD" commit)
-                 (git-update-ref "HEAD" nil commit)))
-      (git-update-status-files files t)
-      (git-setup-commit-buffer commit)
-      (git-commit-file))))
-
-(defun git-cherry-pick-commit (arg)
-  "Cherry-pick a commit."
-  (interactive (list (git-read-commit-name "Cherry-pick commit: ")))
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((commit (git-rev-parse (concat arg "^0"))))
-    (unless commit (error "Not a valid commit '%s'." arg))
-    (when (git-rev-parse (concat commit "^2"))
-      (error "Cannot cherry-pick a merge commit."))
-    (let ((files (git-get-commit-files commit))
-          (ok (git-call-process-display-error "cherry-pick" "-n" commit)))
-      (git-update-status-files files ok)
-      (with-current-buffer (git-setup-commit-buffer commit)
-        (goto-char (point-min))
-        (if (re-search-forward "^\n*Signed-off-by:" nil t 1)
-            (goto-char (match-beginning 0))
-          (goto-char (point-max)))
-        (insert "(cherry picked from commit " commit ")\n"))
-      (when ok (git-commit-file)))))
-
-(defun git-revert-commit (arg)
-  "Revert a commit."
-  (interactive (list (git-read-commit-name "Revert commit: ")))
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((commit (git-rev-parse (concat arg "^0"))))
-    (unless commit (error "Not a valid commit '%s'." arg))
-    (when (git-rev-parse (concat commit "^2"))
-      (error "Cannot revert a merge commit."))
-    (let ((files (git-get-commit-files commit))
-          (subject (git-get-commit-description commit))
-          (ok (git-call-process-display-error "revert" "-n" commit)))
-      (git-update-status-files files ok)
-      (when (string-match "^[0-9a-f]+ - \\(.*\\)$" subject)
-        (setq subject (match-string 1 subject)))
-      (git-setup-log-buffer (get-buffer-create "*git-commit*")
-                            (git-get-merge-heads) nil nil (format "Revert \"%s\"" subject) nil
-                            (format "This reverts commit %s.\n" commit))
-      (when ok (git-commit-file)))))
-
-(defun git-find-file ()
-  "Visit the current file in its own buffer."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((info (ewoc-data (ewoc-locate git-status))))
-    (unless (git-expand-directory info)
-      (find-file (git-fileinfo->name info))
-      (when (eq 'unmerged (git-fileinfo->state info))
-        (smerge-mode 1)))))
-
-(defun git-find-file-other-window ()
-  "Visit the current file in its own buffer in another window."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((info (ewoc-data (ewoc-locate git-status))))
-    (find-file-other-window (git-fileinfo->name info))
-    (when (eq 'unmerged (git-fileinfo->state info))
-      (smerge-mode))))
-
-(defun git-find-file-imerge ()
-  "Visit the current file in interactive merge mode."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((info (ewoc-data (ewoc-locate git-status))))
-    (find-file (git-fileinfo->name info))
-    (smerge-ediff)))
-
-(defun git-view-file ()
-  "View the current file in its own buffer."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (let ((info (ewoc-data (ewoc-locate git-status))))
-    (view-file (git-fileinfo->name info))))
-
-(defun git-refresh-status ()
-  "Refresh the git status buffer."
-  (interactive)
-  (unless git-status (error "Not in git-status buffer."))
-  (message "Refreshing git status...")
-  (git-update-status-files)
-  (message "Refreshing git status...done"))
-
-(defun git-status-quit ()
-  "Quit git-status mode."
-  (interactive)
-  (bury-buffer))
-
-;;;; Major Mode
-;;;; ------------------------------------------------------------
-
-(defvar git-status-mode-hook nil
-  "Run after `git-status-mode' is setup.")
-
-(defvar git-status-mode-map nil
-  "Keymap for git major mode.")
-
-(defvar git-status nil
-  "List of all files managed by the git-status mode.")
-
-(unless git-status-mode-map
-  (let ((map (make-keymap))
-        (commit-map (make-sparse-keymap))
-        (diff-map (make-sparse-keymap))
-        (toggle-map (make-sparse-keymap)))
-    (suppress-keymap map)
-    (define-key map "?"   'git-help)
-    (define-key map "h"   'git-help)
-    (define-key map " "   'git-next-file)
-    (define-key map "a"   'git-add-file)
-    (define-key map "c"   'git-commit-file)
-    (define-key map "\C-c" commit-map)
-    (define-key map "d"    diff-map)
-    (define-key map "="   'git-diff-file)
-    (define-key map "f"   'git-find-file)
-    (define-key map "\r"  'git-find-file)
-    (define-key map "g"   'git-refresh-status)
-    (define-key map "i"   'git-ignore-file)
-    (define-key map "I"   'git-insert-file)
-    (define-key map "l"   'git-log-file)
-    (define-key map "m"   'git-mark-file)
-    (define-key map "M"   'git-mark-all)
-    (define-key map "n"   'git-next-file)
-    (define-key map "N"   'git-next-unmerged-file)
-    (define-key map "o"   'git-find-file-other-window)
-    (define-key map "p"   'git-prev-file)
-    (define-key map "P"   'git-prev-unmerged-file)
-    (define-key map "q"   'git-status-quit)
-    (define-key map "r"   'git-remove-file)
-    (define-key map "t"    toggle-map)
-    (define-key map "T"   'git-toggle-all-marks)
-    (define-key map "u"   'git-unmark-file)
-    (define-key map "U"   'git-revert-file)
-    (define-key map "v"   'git-view-file)
-    (define-key map "x"   'git-remove-handled)
-    (define-key map "\C-?" 'git-unmark-file-up)
-    (define-key map "\M-\C-?" 'git-unmark-all)
-    ; the commit submap
-    (define-key commit-map "\C-a" 'git-amend-commit)
-    (define-key commit-map "\C-b" 'git-branch)
-    (define-key commit-map "\C-o" 'git-checkout)
-    (define-key commit-map "\C-p" 'git-cherry-pick-commit)
-    (define-key commit-map "\C-v" 'git-revert-commit)
-    ; the diff submap
-    (define-key diff-map "b" 'git-diff-file-base)
-    (define-key diff-map "c" 'git-diff-file-combined)
-    (define-key diff-map "=" 'git-diff-file)
-    (define-key diff-map "e" 'git-diff-file-idiff)
-    (define-key diff-map "E" 'git-find-file-imerge)
-    (define-key diff-map "h" 'git-diff-file-merge-head)
-    (define-key diff-map "m" 'git-diff-file-mine)
-    (define-key diff-map "o" 'git-diff-file-other)
-    ; the toggle submap
-    (define-key toggle-map "u" 'git-toggle-show-uptodate)
-    (define-key toggle-map "i" 'git-toggle-show-ignored)
-    (define-key toggle-map "k" 'git-toggle-show-unknown)
-    (define-key toggle-map "m" 'git-toggle-all-marks)
-    (setq git-status-mode-map map))
-  (easy-menu-define git-menu git-status-mode-map
-    "Git Menu"
-    `("Git"
-      ["Refresh" git-refresh-status t]
-      ["Commit" git-commit-file t]
-      ["Checkout..." git-checkout t]
-      ["New Branch..." git-branch t]
-      ["Cherry-pick Commit..." git-cherry-pick-commit t]
-      ["Revert Commit..." git-revert-commit t]
-      ("Merge"
-	["Next Unmerged File" git-next-unmerged-file t]
-	["Prev Unmerged File" git-prev-unmerged-file t]
-	["Interactive Merge File" git-find-file-imerge t]
-	["Diff Against Common Base File" git-diff-file-base t]
-	["Diff Combined" git-diff-file-combined t]
-	["Diff Against Merge Head" git-diff-file-merge-head t]
-	["Diff Against Mine" git-diff-file-mine t]
-	["Diff Against Other" git-diff-file-other t])
-      "--------"
-      ["Add File" git-add-file t]
-      ["Revert File" git-revert-file t]
-      ["Ignore File" git-ignore-file t]
-      ["Remove File" git-remove-file t]
-      ["Insert File" git-insert-file t]
-      "--------"
-      ["Find File" git-find-file t]
-      ["View File" git-view-file t]
-      ["Diff File" git-diff-file t]
-      ["Interactive Diff File" git-diff-file-idiff t]
-      ["Log" git-log-file t]
-      "--------"
-      ["Mark" git-mark-file t]
-      ["Mark All" git-mark-all t]
-      ["Unmark" git-unmark-file t]
-      ["Unmark All" git-unmark-all t]
-      ["Toggle All Marks" git-toggle-all-marks t]
-      ["Hide Handled Files" git-remove-handled t]
-      "--------"
-      ["Show Uptodate Files" git-toggle-show-uptodate :style toggle :selected git-show-uptodate]
-      ["Show Ignored Files" git-toggle-show-ignored :style toggle :selected git-show-ignored]
-      ["Show Unknown Files" git-toggle-show-unknown :style toggle :selected git-show-unknown]
-      "--------"
-      ["Quit" git-status-quit t])))
-
-
-;; git mode should only run in the *git status* buffer
-(put 'git-status-mode 'mode-class 'special)
-
-(defun git-status-mode ()
-  "Major mode for interacting with Git.
-Commands:
-\\{git-status-mode-map}"
-  (kill-all-local-variables)
-  (buffer-disable-undo)
-  (setq mode-name "git status"
-        major-mode 'git-status-mode
-        goal-column 17
-        buffer-read-only t)
-  (use-local-map git-status-mode-map)
-  (let ((buffer-read-only nil))
-    (erase-buffer)
-  (let ((status (ewoc-create 'git-fileinfo-prettyprint "" "")))
-    (set (make-local-variable 'git-status) status))
-  (set (make-local-variable 'list-buffers-directory) default-directory)
-  (make-local-variable 'git-show-uptodate)
-  (make-local-variable 'git-show-ignored)
-  (make-local-variable 'git-show-unknown)
-  (run-hooks 'git-status-mode-hook)))
-
-(defun git-find-status-buffer (dir)
-  "Find the git status buffer handling a specified directory."
-  (let ((list (buffer-list))
-        (fulldir (expand-file-name dir))
-        found)
-    (while (and list (not found))
-      (let ((buffer (car list)))
-        (with-current-buffer buffer
-          (when (and list-buffers-directory
-                     (string-equal fulldir (expand-file-name list-buffers-directory))
-		     (eq major-mode 'git-status-mode))
-            (setq found buffer))))
-      (setq list (cdr list)))
-    found))
-
-(defun git-status (dir)
-  "Entry point into git-status mode."
-  (interactive "DSelect directory: ")
-  (setq dir (git-get-top-dir dir))
-  (if (file-exists-p (concat (file-name-as-directory dir) ".git"))
-      (let ((buffer (or (and git-reuse-status-buffer (git-find-status-buffer dir))
-                        (create-file-buffer (expand-file-name "*git-status*" dir)))))
-        (switch-to-buffer buffer)
-        (cd dir)
-        (git-status-mode)
-        (git-refresh-status)
-        (goto-char (point-min))
-        (add-hook 'after-save-hook 'git-update-saved-file))
-    (message "%s is not a git working tree." dir)))
-
-(defun git-update-saved-file ()
-  "Update the corresponding git-status buffer when a file is saved.
-Meant to be used in `after-save-hook'."
-  (let* ((file (expand-file-name buffer-file-name))
-         (dir (condition-case nil (git-get-top-dir (file-name-directory file)) (error nil)))
-         (buffer (and dir (git-find-status-buffer dir))))
-    (when buffer
-      (with-current-buffer buffer
-        (let ((filename (file-relative-name file dir)))
-          ; skip files located inside the .git directory
-          (unless (string-match "^\\.git/" filename)
-            (git-call-process nil "add" "--refresh" "--" filename)
-            (git-update-status-files (list filename))))))))
-
-(defun git-help ()
-  "Display help for Git mode."
-  (interactive)
-  (describe-function 'git-status-mode))
-
-(provide 'git)
-;;; git.el ends here
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (16 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 18/25] contrib: remove 'emacs' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  1:51   ` Jeff King
  2014-05-09  0:58 ` [PATCH v1 20/25] contrib: remove 'contacts' Felipe Contreras
                   ` (7 subsequent siblings)
  25 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras, Jeff King

No activity since 2012, no tests, no chance of ever graduating.

Cc: Jeff King <peff@peff.net>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/diff-highlight/README         | 152 -----------------------------
 contrib/diff-highlight/diff-highlight | 173 ----------------------------------
 2 files changed, 325 deletions(-)
 delete mode 100644 contrib/diff-highlight/README
 delete mode 100755 contrib/diff-highlight/diff-highlight

diff --git a/contrib/diff-highlight/README b/contrib/diff-highlight/README
deleted file mode 100644
index 502e03b..0000000
--- a/contrib/diff-highlight/README
+++ /dev/null
@@ -1,152 +0,0 @@
-diff-highlight
-==============
-
-Line oriented diffs are great for reviewing code, because for most
-hunks, you want to see the old and the new segments of code next to each
-other. Sometimes, though, when an old line and a new line are very
-similar, it's hard to immediately see the difference.
-
-You can use "--color-words" to highlight only the changed portions of
-lines. However, this can often be hard to read for code, as it loses
-the line structure, and you end up with oddly formatted bits.
-
-Instead, this script post-processes the line-oriented diff, finds pairs
-of lines, and highlights the differing segments.  It's currently very
-simple and stupid about doing these tasks. In particular:
-
-  1. It will only highlight hunks in which the number of removed and
-     added lines is the same, and it will pair lines within the hunk by
-     position (so the first removed line is compared to the first added
-     line, and so forth). This is simple and tends to work well in
-     practice. More complex changes don't highlight well, so we tend to
-     exclude them due to the "same number of removed and added lines"
-     restriction. Or even if we do try to highlight them, they end up
-     not highlighting because of our "don't highlight if the whole line
-     would be highlighted" rule.
-
-  2. It will find the common prefix and suffix of two lines, and
-     consider everything in the middle to be "different". It could
-     instead do a real diff of the characters between the two lines and
-     find common subsequences. However, the point of the highlight is to
-     call attention to a certain area. Even if some small subset of the
-     highlighted area actually didn't change, that's OK. In practice it
-     ends up being more readable to just have a single blob on the line
-     showing the interesting bit.
-
-The goal of the script is therefore not to be exact about highlighting
-changes, but to call attention to areas of interest without being
-visually distracting.  Non-diff lines and existing diff coloration is
-preserved; the intent is that the output should look exactly the same as
-the input, except for the occasional highlight.
-
-Use
----
-
-You can try out the diff-highlight program with:
-
----------------------------------------------
-git log -p --color | /path/to/diff-highlight
----------------------------------------------
-
-If you want to use it all the time, drop it in your $PATH and put the
-following in your git configuration:
-
----------------------------------------------
-[pager]
-	log = diff-highlight | less
-	show = diff-highlight | less
-	diff = diff-highlight | less
----------------------------------------------
-
-Bugs
-----
-
-Because diff-highlight relies on heuristics to guess which parts of
-changes are important, there are some cases where the highlighting is
-more distracting than useful. Fortunately, these cases are rare in
-practice, and when they do occur, the worst case is simply a little
-extra highlighting. This section documents some cases known to be
-sub-optimal, in case somebody feels like working on improving the
-heuristics.
-
-1. Two changes on the same line get highlighted in a blob. For example,
-   highlighting:
-
-----------------------------------------------
--foo(buf, size);
-+foo(obj->buf, obj->size);
-----------------------------------------------
-
-   yields (where the inside of "+{}" would be highlighted):
-
-----------------------------------------------
--foo(buf, size);
-+foo(+{obj->buf, obj->}size);
-----------------------------------------------
-
-   whereas a more semantically meaningful output would be:
-
-----------------------------------------------
--foo(buf, size);
-+foo(+{obj->}buf, +{obj->}size);
-----------------------------------------------
-
-   Note that doing this right would probably involve a set of
-   content-specific boundary patterns, similar to word-diff. Otherwise
-   you get junk like:
-
------------------------------------------------------
--this line has some -{i}nt-{ere}sti-{ng} text on it
-+this line has some +{fa}nt+{a}sti+{c} text on it
------------------------------------------------------
-
-   which is less readable than the current output.
-
-2. The multi-line matching assumes that lines in the pre- and post-image
-   match by position. This is often the case, but can be fooled when a
-   line is removed from the top and a new one added at the bottom (or
-   vice versa). Unless the lines in the middle are also changed, diffs
-   will show this as two hunks, and it will not get highlighted at all
-   (which is good). But if the lines in the middle are changed, the
-   highlighting can be misleading. Here's a pathological case:
-
------------------------------------------------------
--one
--two
--three
--four
-+two 2
-+three 3
-+four 4
-+five 5
------------------------------------------------------
-
-   which gets highlighted as:
-
------------------------------------------------------
--one
--t-{wo}
--three
--f-{our}
-+two 2
-+t+{hree 3}
-+four 4
-+f+{ive 5}
------------------------------------------------------
-
-   because it matches "two" to "three 3", and so forth. It would be
-   nicer as:
-
------------------------------------------------------
--one
--two
--three
--four
-+two +{2}
-+three +{3}
-+four +{4}
-+five 5
------------------------------------------------------
-
-   which would probably involve pre-matching the lines into pairs
-   according to some heuristic.
diff --git a/contrib/diff-highlight/diff-highlight b/contrib/diff-highlight/diff-highlight
deleted file mode 100755
index c4404d4..0000000
--- a/contrib/diff-highlight/diff-highlight
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/perl
-
-use warnings FATAL => 'all';
-use strict;
-
-# Highlight by reversing foreground and background. You could do
-# other things like bold or underline if you prefer.
-my $HIGHLIGHT   = "\x1b[7m";
-my $UNHIGHLIGHT = "\x1b[27m";
-my $COLOR = qr/\x1b\[[0-9;]*m/;
-my $BORING = qr/$COLOR|\s/;
-
-my @removed;
-my @added;
-my $in_hunk;
-
-while (<>) {
-	if (!$in_hunk) {
-		print;
-		$in_hunk = /^$COLOR*\@/;
-	}
-	elsif (/^$COLOR*-/) {
-		push @removed, $_;
-	}
-	elsif (/^$COLOR*\+/) {
-		push @added, $_;
-	}
-	else {
-		show_hunk(\@removed, \@added);
-		@removed = ();
-		@added = ();
-
-		print;
-		$in_hunk = /^$COLOR*[\@ ]/;
-	}
-
-	# Most of the time there is enough output to keep things streaming,
-	# but for something like "git log -Sfoo", you can get one early
-	# commit and then many seconds of nothing. We want to show
-	# that one commit as soon as possible.
-	#
-	# Since we can receive arbitrary input, there's no optimal
-	# place to flush. Flushing on a blank line is a heuristic that
-	# happens to match git-log output.
-	if (!length) {
-		local $| = 1;
-	}
-}
-
-# Flush any queued hunk (this can happen when there is no trailing context in
-# the final diff of the input).
-show_hunk(\@removed, \@added);
-
-exit 0;
-
-sub show_hunk {
-	my ($a, $b) = @_;
-
-	# If one side is empty, then there is nothing to compare or highlight.
-	if (!@$a || !@$b) {
-		print @$a, @$b;
-		return;
-	}
-
-	# If we have mismatched numbers of lines on each side, we could try to
-	# be clever and match up similar lines. But for now we are simple and
-	# stupid, and only handle multi-line hunks that remove and add the same
-	# number of lines.
-	if (@$a != @$b) {
-		print @$a, @$b;
-		return;
-	}
-
-	my @queue;
-	for (my $i = 0; $i < @$a; $i++) {
-		my ($rm, $add) = highlight_pair($a->[$i], $b->[$i]);
-		print $rm;
-		push @queue, $add;
-	}
-	print @queue;
-}
-
-sub highlight_pair {
-	my @a = split_line(shift);
-	my @b = split_line(shift);
-
-	# Find common prefix, taking care to skip any ansi
-	# color codes.
-	my $seen_plusminus;
-	my ($pa, $pb) = (0, 0);
-	while ($pa < @a && $pb < @b) {
-		if ($a[$pa] =~ /$COLOR/) {
-			$pa++;
-		}
-		elsif ($b[$pb] =~ /$COLOR/) {
-			$pb++;
-		}
-		elsif ($a[$pa] eq $b[$pb]) {
-			$pa++;
-			$pb++;
-		}
-		elsif (!$seen_plusminus && $a[$pa] eq '-' && $b[$pb] eq '+') {
-			$seen_plusminus = 1;
-			$pa++;
-			$pb++;
-		}
-		else {
-			last;
-		}
-	}
-
-	# Find common suffix, ignoring colors.
-	my ($sa, $sb) = ($#a, $#b);
-	while ($sa >= $pa && $sb >= $pb) {
-		if ($a[$sa] =~ /$COLOR/) {
-			$sa--;
-		}
-		elsif ($b[$sb] =~ /$COLOR/) {
-			$sb--;
-		}
-		elsif ($a[$sa] eq $b[$sb]) {
-			$sa--;
-			$sb--;
-		}
-		else {
-			last;
-		}
-	}
-
-	if (is_pair_interesting(\@a, $pa, $sa, \@b, $pb, $sb)) {
-		return highlight_line(\@a, $pa, $sa),
-		       highlight_line(\@b, $pb, $sb);
-	}
-	else {
-		return join('', @a),
-		       join('', @b);
-	}
-}
-
-sub split_line {
-	local $_ = shift;
-	return map { /$COLOR/ ? $_ : (split //) }
-	       split /($COLOR*)/;
-}
-
-sub highlight_line {
-	my ($line, $prefix, $suffix) = @_;
-
-	return join('',
-		@{$line}[0..($prefix-1)],
-		$HIGHLIGHT,
-		@{$line}[$prefix..$suffix],
-		$UNHIGHLIGHT,
-		@{$line}[($suffix+1)..$#$line]
-	);
-}
-
-# Pairs are interesting to highlight only if we are going to end up
-# highlighting a subset (i.e., not the whole line). Otherwise, the highlighting
-# is just useless noise. We can detect this by finding either a matching prefix
-# or suffix (disregarding boring bits like whitespace and colorization).
-sub is_pair_interesting {
-	my ($a, $pa, $sa, $b, $pb, $sb) = @_;
-	my $prefix_a = join('', @$a[0..($pa-1)]);
-	my $prefix_b = join('', @$b[0..($pb-1)]);
-	my $suffix_a = join('', @$a[($sa+1)..$#$a]);
-	my $suffix_b = join('', @$b[($sb+1)..$#$b]);
-
-	return $prefix_a !~ /^$COLOR*-$BORING*$/ ||
-	       $prefix_b !~ /^$COLOR*\+$BORING*$/ ||
-	       $suffix_a !~ /^$BORING*$/ ||
-	       $suffix_b !~ /^$BORING*$/;
-}
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 20/25] contrib: remove 'contacts'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (17 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 19/25] contrib: remove 'diff-highlight' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-10  1:59   ` brian m. carlson
  2014-05-09  0:58 ` [PATCH v1 22/25] contrib: remove 'fast-import' Felipe Contreras
                   ` (6 subsequent siblings)
  25 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras, Eric Sunshine

There are better out-of-tree tools, and this tool is not planned to move
into the core anyway.

No tests either.

Cc: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/contacts/git-contacts     | 203 --------------------------------------
 contrib/contacts/git-contacts.txt |  94 ------------------
 2 files changed, 297 deletions(-)
 delete mode 100755 contrib/contacts/git-contacts
 delete mode 100644 contrib/contacts/git-contacts.txt

diff --git a/contrib/contacts/git-contacts b/contrib/contacts/git-contacts
deleted file mode 100755
index dbe2abf..0000000
--- a/contrib/contacts/git-contacts
+++ /dev/null
@@ -1,203 +0,0 @@
-#!/usr/bin/perl
-
-# List people who might be interested in a patch.  Useful as the argument to
-# git-send-email --cc-cmd option, and in other situations.
-#
-# Usage: git contacts <file | rev-list option> ...
-
-use strict;
-use warnings;
-use IPC::Open2;
-
-my $since = '5-years-ago';
-my $min_percent = 10;
-my $labels_rx = qr/Signed-off-by|Reviewed-by|Acked-by|Cc/i;
-my %seen;
-
-sub format_contact {
-	my ($name, $email) = @_;
-	return "$name <$email>";
-}
-
-sub parse_commit {
-	my ($commit, $data) = @_;
-	my $contacts = $commit->{contacts};
-	my $inbody = 0;
-	for (split(/^/m, $data)) {
-		if (not $inbody) {
-			if (/^author ([^<>]+) <(\S+)> .+$/) {
-				$contacts->{format_contact($1, $2)} = 1;
-			} elsif (/^$/) {
-				$inbody = 1;
-			}
-		} elsif (/^$labels_rx:\s+([^<>]+)\s+<(\S+?)>$/o) {
-			$contacts->{format_contact($1, $2)} = 1;
-		}
-	}
-}
-
-sub import_commits {
-	my ($commits) = @_;
-	return unless %$commits;
-	my $pid = open2 my $reader, my $writer, qw(git cat-file --batch);
-	for my $id (keys(%$commits)) {
-		print $writer "$id\n";
-		my $line = <$reader>;
-		if ($line =~ /^([0-9a-f]{40}) commit (\d+)/) {
-			my ($cid, $len) = ($1, $2);
-			die "expected $id but got $cid\n" unless $id eq $cid;
-			my $data;
-			# cat-file emits newline after data, so read len+1
-			read $reader, $data, $len + 1;
-			parse_commit($commits->{$id}, $data);
-		}
-	}
-	close $reader;
-	close $writer;
-	waitpid($pid, 0);
-	die "git-cat-file error: $?\n" if $?;
-}
-
-sub get_blame {
-	my ($commits, $source, $from, $ranges) = @_;
-	return unless @$ranges;
-	open my $f, '-|',
-		qw(git blame --porcelain -C),
-		map({"-L$_->[0],+$_->[1]"} @$ranges),
-		'--since', $since, "$from^", '--', $source or die;
-	while (<$f>) {
-		if (/^([0-9a-f]{40}) \d+ \d+ \d+$/) {
-			my $id = $1;
-			$commits->{$id} = { id => $id, contacts => {} }
-				unless $seen{$id};
-			$seen{$id} = 1;
-		}
-	}
-	close $f;
-}
-
-sub blame_sources {
-	my ($sources, $commits) = @_;
-	for my $s (keys %$sources) {
-		for my $id (keys %{$sources->{$s}}) {
-			get_blame($commits, $s, $id, $sources->{$s}{$id});
-		}
-	}
-}
-
-sub scan_patches {
-	my ($sources, $id, $f) = @_;
-	my $source;
-	while (<$f>) {
-		if (/^From ([0-9a-f]{40}) Mon Sep 17 00:00:00 2001$/) {
-			$id = $1;
-			$seen{$id} = 1;
-		}
-		next unless $id;
-		if (m{^--- (?:a/(.+)|/dev/null)$}) {
-			$source = $1;
-		} elsif (/^@@ -(\d+)(?:,(\d+))?/ && $source) {
-			my $len = defined($2) ? $2 : 1;
-			push @{$sources->{$source}{$id}}, [$1, $len] if $len;
-		}
-	}
-}
-
-sub scan_patch_file {
-	my ($commits, $file) = @_;
-	open my $f, '<', $file or die "read failure: $file: $!\n";
-	scan_patches($commits, undef, $f);
-	close $f;
-}
-
-sub parse_rev_args {
-	my @args = @_;
-	open my $f, '-|',
-		qw(git rev-parse --revs-only --default HEAD --symbolic), @args
-		or die;
-	my @revs;
-	while (<$f>) {
-		chomp;
-		push @revs, $_;
-	}
-	close $f;
-	return @revs if scalar(@revs) != 1;
-	return "^$revs[0]", 'HEAD' unless $revs[0] =~ /^-/;
-	return $revs[0], 'HEAD';
-}
-
-sub scan_rev_args {
-	my ($commits, $args) = @_;
-	my @revs = parse_rev_args(@$args);
-	open my $f, '-|', qw(git rev-list --reverse), @revs or die;
-	while (<$f>) {
-		chomp;
-		my $id = $_;
-		$seen{$id} = 1;
-		open my $g, '-|', qw(git show -C --oneline), $id or die;
-		scan_patches($commits, $id, $g);
-		close $g;
-	}
-	close $f;
-}
-
-sub mailmap_contacts {
-	my ($contacts) = @_;
-	my %mapped;
-	my $pid = open2 my $reader, my $writer, qw(git check-mailmap --stdin);
-	for my $contact (keys(%$contacts)) {
-		print $writer "$contact\n";
-		my $canonical = <$reader>;
-		chomp $canonical;
-		$mapped{$canonical} += $contacts->{$contact};
-	}
-	close $reader;
-	close $writer;
-	waitpid($pid, 0);
-	die "git-check-mailmap error: $?\n" if $?;
-	return \%mapped;
-}
-
-if (!@ARGV) {
-	die "No input revisions or patch files\n";
-}
-
-my (@files, @rev_args);
-for (@ARGV) {
-	if (-e) {
-		push @files, $_;
-	} else {
-		push @rev_args, $_;
-	}
-}
-
-my %sources;
-for (@files) {
-	scan_patch_file(\%sources, $_);
-}
-if (@rev_args) {
-	scan_rev_args(\%sources, \@rev_args)
-}
-
-my $toplevel = `git rev-parse --show-toplevel`;
-chomp $toplevel;
-chdir($toplevel) or die "chdir failure: $toplevel: $!\n";
-
-my %commits;
-blame_sources(\%sources, \%commits);
-import_commits(\%commits);
-
-my $contacts = {};
-for my $commit (values %commits) {
-	for my $contact (keys %{$commit->{contacts}}) {
-		$contacts->{$contact}++;
-	}
-}
-$contacts = mailmap_contacts($contacts);
-
-my $ncommits = scalar(keys %commits);
-for my $contact (keys %$contacts) {
-	my $percent = $contacts->{$contact} * 100 / $ncommits;
-	next if $percent < $min_percent;
-	print "$contact\n";
-}
diff --git a/contrib/contacts/git-contacts.txt b/contrib/contacts/git-contacts.txt
deleted file mode 100644
index dd914d1..0000000
--- a/contrib/contacts/git-contacts.txt
+++ /dev/null
@@ -1,94 +0,0 @@
-git-contacts(1)
-===============
-
-NAME
-----
-git-contacts - List people who might be interested in a set of changes
-
-
-SYNOPSIS
---------
-[verse]
-'git contacts' (<patch>|<range>|<rev>)...
-
-
-DESCRIPTION
------------
-
-Given a set of changes, specified as patch files or revisions, determine people
-who might be interested in those changes.  This is done by consulting the
-history of each patch or revision hunk to find people mentioned by commits
-which touched the lines of files under consideration.
-
-Input consists of one or more patch files or revision arguments.  A revision
-argument can be a range or a single `<rev>` which is interpreted as
-`<rev>..HEAD`, thus the same revision arguments are accepted as for
-linkgit:git-format-patch[1]. Patch files and revision arguments can be combined
-in the same invocation.
-
-This command can be useful for determining the list of people with whom to
-discuss proposed changes, or for finding the list of recipients to Cc: when
-submitting a patch series via `git send-email`. For the latter case, `git
-contacts` can be used as the argument to `git send-email`'s `--cc-cmd` option.
-
-
-DISCUSSION
-----------
-
-`git blame` is invoked for each hunk in a patch file or revision.  For each
-commit mentioned by `git blame`, the commit message is consulted for people who
-authored, reviewed, signed, acknowledged, or were Cc:'d.  Once the list of
-participants is known, each person's relevance is computed by considering how
-many commits mentioned that person compared with the total number of commits
-under consideration.  The final output consists only of participants who exceed
-a minimum threshold of participation.
-
-
-OUTPUT
-------
-
-For each person of interest, a single line is output, terminated by a newline.
-If the person's name is known, ``Name $$<user@host>$$'' is printed; otherwise
-only ``$$<user@host>$$'' is printed.
-
-
-EXAMPLES
---------
-
-* Consult patch files:
-+
-------------
-$ git contacts feature/*.patch
-------------
-
-* Revision range:
-+
-------------
-$ git contacts R1..R2
-------------
-
-* From a single revision to `HEAD`:
-+
-------------
-$ git contacts origin
-------------
-
-* Helper for `git send-email`:
-+
-------------
-$ git send-email --cc-cmd='git contacts' feature/*.patch
-------------
-
-
-LIMITATIONS
------------
-
-Several conditions controlling a person's significance are currently
-hard-coded, such as minimum participation level (10%), blame date-limiting (5
-years), and `-C` level for detecting moved and copied lines (a single `-C`). In
-the future, these conditions may become configurable.
-
-
-GIT
----
-Part of the linkgit:git[1] suite
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 22/25] contrib: remove 'fast-import'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (18 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 20/25] contrib: remove 'contacts' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  0:58 ` [PATCH v1 24/25] contrib: remove 'hooks' Felipe Contreras
                   ` (5 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Felipe Contreras, Johannes Schindelin, David Aguilar

No tests, no documentation.

No chance of ever graduating.

Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Cc: David Aguilar <davvid@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/fast-import/git-import.perl         |  64 -----
 contrib/fast-import/git-import.sh           |  38 ---
 contrib/fast-import/git-p4.README           |  12 -
 contrib/fast-import/import-directories.perl | 417 ----------------------------
 contrib/fast-import/import-tars.perl        | 189 -------------
 contrib/fast-import/import-zips.py          |  78 ------
 6 files changed, 798 deletions(-)
 delete mode 100755 contrib/fast-import/git-import.perl
 delete mode 100755 contrib/fast-import/git-import.sh
 delete mode 100644 contrib/fast-import/git-p4.README
 delete mode 100755 contrib/fast-import/import-directories.perl
 delete mode 100755 contrib/fast-import/import-tars.perl
 delete mode 100755 contrib/fast-import/import-zips.py

diff --git a/contrib/fast-import/git-import.perl b/contrib/fast-import/git-import.perl
deleted file mode 100755
index 0891b9e..0000000
--- a/contrib/fast-import/git-import.perl
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/perl
-#
-# Performs an initial import of a directory. This is the equivalent
-# of doing 'git init; git add .; git commit'. It's a little slower,
-# but is meant to be a simple fast-import example.
-
-use strict;
-use File::Find;
-
-my $USAGE = 'usage: git-import branch import-message';
-my $branch = shift or die "$USAGE\n";
-my $message = shift or die "$USAGE\n";
-
-chomp(my $username = `git config user.name`);
-chomp(my $email = `git config user.email`);
-die 'You need to set user name and email'
-  unless $username && $email;
-
-system('git init');
-open(my $fi, '|-', qw(git fast-import --date-format=now))
-  or die "unable to spawn fast-import: $!";
-
-print $fi <<EOF;
-commit refs/heads/$branch
-committer $username <$email> now
-data <<MSGEOF
-$message
-MSGEOF
-
-EOF
-
-find(
-  sub {
-    if($File::Find::name eq './.git') {
-      $File::Find::prune = 1;
-      return;
-    }
-    return unless -f $_;
-
-    my $fn = $File::Find::name;
-    $fn =~ s#^.\/##;
-
-    open(my $in, '<', $_)
-      or die "unable to open $fn: $!";
-    my @st = stat($in)
-      or die "unable to stat $fn: $!";
-    my $len = $st[7];
-
-    print $fi "M 644 inline $fn\n";
-    print $fi "data $len\n";
-    while($len > 0) {
-      my $r = read($in, my $buf, $len < 4096 ? $len : 4096);
-      defined($r) or die "read error from $fn: $!";
-      $r > 0 or die "premature EOF from $fn: $!";
-      print $fi $buf;
-      $len -= $r;
-    }
-    print $fi "\n";
-
-  }, '.'
-);
-
-close($fi);
-exit $?;
diff --git a/contrib/fast-import/git-import.sh b/contrib/fast-import/git-import.sh
deleted file mode 100755
index f8d803c..0000000
--- a/contrib/fast-import/git-import.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-#
-# Performs an initial import of a directory. This is the equivalent
-# of doing 'git init; git add .; git commit'. It's a lot slower,
-# but is meant to be a simple fast-import example.
-
-if [ -z "$1" -o -z "$2" ]; then
-	echo "usage: git-import branch import-message"
-	exit 1
-fi
-
-USERNAME="$(git config user.name)"
-EMAIL="$(git config user.email)"
-
-if [ -z "$USERNAME" -o -z "$EMAIL" ]; then
-	echo "You need to set user name and email"
-	exit 1
-fi
-
-git init
-
-(
-	cat <<EOF
-commit refs/heads/$1
-committer $USERNAME <$EMAIL> now
-data <<MSGEOF
-$2
-MSGEOF
-
-EOF
-	find * -type f|while read i;do
-		echo "M 100644 inline $i"
-		echo data $(stat -c '%s' "$i")
-		cat "$i"
-		echo
-	done
-	echo
-) | git fast-import --date-format=now
diff --git a/contrib/fast-import/git-p4.README b/contrib/fast-import/git-p4.README
deleted file mode 100644
index cec5ecf..0000000
--- a/contrib/fast-import/git-p4.README
+++ /dev/null
@@ -1,12 +0,0 @@
-The git-p4 script moved to the top-level of the git source directory.
-
-Invoke it as any other git command, like "git p4 clone", for instance.
-
-Note that the top-level git-p4.py script is now the source.  It is
-built using make to git-p4, which will be installed.
-
-Windows users can copy the git-p4.py source script directly, possibly
-invoking it through a batch file called "git-p4.bat" in the same folder.
-It should contain just one line:
-
-    @python "%~d0%~p0git-p4.py" %*
diff --git a/contrib/fast-import/import-directories.perl b/contrib/fast-import/import-directories.perl
deleted file mode 100755
index 4dec1f1..0000000
--- a/contrib/fast-import/import-directories.perl
+++ /dev/null
@@ -1,417 +0,0 @@
-#!/usr/bin/perl
-#
-# Copyright 2008-2009 Peter Krefting <peter@softwolves.pp.se>
-#
-# ------------------------------------------------------------------------
-#
-# 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.
-#
-# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-#
-# ------------------------------------------------------------------------
-
-=pod
-
-=head1 NAME
-
-import-directories - Import bits and pieces to Git.
-
-=head1 SYNOPSIS
-
-B<import-directories.perl> F<configfile> F<outputfile>
-
-=head1 DESCRIPTION
-
-Script to import arbitrary projects version controlled by the "copy the
-source directory to a new location and edit it there"-version controlled
-projects into version control. Handles projects with arbitrary branching
-and version trees, taking a file describing the inputs and generating a
-file compatible with the L<git-fast-import(1)> format.
-
-=head1 CONFIGURATION FILE
-
-=head2 Format
-
-The configuration file is based on the standard I<.ini> format.
-
- ; Comments start with semi-colons
- [section]
- key=value
-
-Please see below for information on how to escape special characters.
-
-=head2 Global configuration
-
-Global configuration is done in the B<[config]> section, which should be
-the first section in the file. Configuration can be changed by
-repeating configuration sections later on.
-
- [config]
- ; configure conversion of CRLFs. "convert" means that all CRLFs
- ; should be converted into LFs (suitable for the core.autocrlf
- ; setting set to true in Git). "none" means that all data is
- ; treated as binary.
- crlf=convert
-
-=head2 Revision configuration
-
-Each revision that is to be imported is described in three
-sections. Revisions should be defined in topological order, so
-that a revision's parent has always been defined when a new revision
-is introduced. All the sections for one revision must be defined
-before defining the next revision.
-
-Each revision is assigned a unique numerical identifier. The
-numbers do not need to be consecutive, nor monotonically
-increasing.
-
-For instance, if your configuration file contains only the two
-revisions 4711 and 42, where 4711 is the initial commit, the
-only requirement is that 4711 is completely defined before 42.
-
-=pod
-
-=head3 Revision description section
-
-A section whose section name is just an integer gives meta-data
-about the revision.
-
- [3]
- ; author sets the author of the revisions
- author=Peter Krefting <peter@softwolves.pp.se>
- ; branch sets the branch that the revision should be committed to
- branch=master
- ; parent describes the revision that is the parent of this commit
- ; (optional)
- parent=1
- ; merges describes a revision that is merged into this commit
- ; (optional; can be repeated)
- merges=2
- ; selects one file to take the timestamp from
- ; (optional; if unspecified, the most recent file from the .files
- ;  section is used)
- timestamp=3/source.c
-
-=head3 Revision contents section
-
-A section whose section name is an integer followed by B<.files>
-describe all the files included in this revision. If a file that
-was available previously is not included in this revision, it will
-be removed.
-
-If an on-disk revision is incomplete, you can point to files from
-a previous revision. There are no restrictions on where the source
-files are located, nor on their names.
-
- [3.files]
- ; the key is the path inside the repository, the value is the path
- ; as seen from the importer script.
- source.c=ver-3.00/source.c
- source.h=ver-2.99/source.h
- readme.txt=ver-3.00/introduction to the project.txt
-
-File names are treated as byte strings (but please see below on
-quoting rules), and should be stored in the configuration file in
-the encoding that should be used in the generated repository.
-
-=head3 Revision commit message section
-
-A section whose section name is an integer followed by B<.message>
-gives the commit message. This section is read verbatim, up until
-the beginning of the next section. As such, a commit message may not
-contain a line that begins with an opening square bracket ("[") and
-ends with a closing square bracket ("]"), unless they are surrounded
-by whitespace or other characters.
-
- [3.message]
- Implement foobar.
- ; trailing blank lines are ignored.
-
-=cut
-
-# Globals
-use strict;
-use warnings;
-use integer;
-my $crlfmode = 0;
-my @revs;
-my (%revmap, %message, %files, %author, %branch, %parent, %merges, %time, %timesource);
-my $sectiontype = 0;
-my $rev = 0;
-my $mark = 1;
-
-# Check command line
-if ($#ARGV < 1 || $ARGV[0] =~ /^--?h/)
-{
-    exec('perldoc', $0);
-    exit 1;
-}
-
-# Open configuration
-my $config = $ARGV[0];
-open CFG, '<', $config or die "Cannot open configuration file \"$config\": ";
-
-# Open output
-my $output = $ARGV[1];
-open OUT, '>', $output or die "Cannot create output file \"$output\": ";
-binmode OUT;
-
-LINE: while (my $line = <CFG>)
-{
-	$line =~ s/\r?\n$//;
-	next LINE if $sectiontype != 4 && $line eq '';
-	next LINE if $line =~ /^;/;
-	my $oldsectiontype = $sectiontype;
-	my $oldrev = $rev;
-
-	# Sections
-	if ($line =~ m"^\[(config|(\d+)(|\.files|\.message))\]$")
-	{
-		if ($1 eq 'config')
-		{
-			$sectiontype = 1;
-		}
-		elsif ($3 eq '')
-		{
-			$sectiontype = 2;
-			$rev = $2;
-			# Create a new revision
-			die "Duplicate rev: $line\n " if defined $revmap{$rev};
-			print "Reading revision $rev\n";
-			push @revs, $rev;
-			$revmap{$rev} = $mark ++;
-			$time{$revmap{$rev}} = 0;
-		}
-		elsif ($3 eq '.files')
-		{
-			$sectiontype = 3;
-			$rev = $2;
-			die "Revision mismatch: $line\n " unless $rev == $oldrev;
-		}
-		elsif ($3 eq '.message')
-		{
-			$sectiontype = 4;
-			$rev = $2;
-			die "Revision mismatch: $line\n " unless $rev == $oldrev;
-		}
-		else
-		{
-			die "Internal parse error: $line\n ";
-		}
-		next LINE;
-	}
-
-	# Parse data
-	if ($sectiontype != 4)
-	{
-		# Key and value
-		if ($line =~ m"^\s*([^\s].*=.*[^\s])\s*$")
-		{
-			my ($key, $value) = &parsekeyvaluepair($1);
-			# Global configuration
-			if (1 == $sectiontype)
-			{
-				if ($key eq 'crlf')
-				{
-					$crlfmode = 1, next LINE if $value eq 'convert';
-					$crlfmode = 0, next LINE if $value eq 'none';
-				}
-				die "Unknown configuration option: $line\n ";
-			}
-			# Revision specification
-			if (2 == $sectiontype)
-			{
-				my $current = $revmap{$rev};
-				$author{$current} = $value, next LINE if $key eq 'author';
-				$branch{$current} = $value, next LINE if $key eq 'branch';
-				$parent{$current} = $value, next LINE if $key eq 'parent';
-				$timesource{$current} = $value, next LINE if $key eq 'timestamp';
-				push(@{$merges{$current}}, $value), next LINE if $key eq 'merges';
-				die "Unknown revision option: $line\n ";
-			}
-			# Filespecs
-			if (3 == $sectiontype)
-			{
-				# Add the file and create a marker
-				die "File not found: $line\n " unless -f $value;
-				my $current = $revmap{$rev};
-				${$files{$current}}{$key} = $mark;
-				my $time = &fileblob($value, $crlfmode, $mark ++);
-
-				# Update revision timestamp if more recent than other
-				# files seen, or if this is the file we have selected
-				# to take the time stamp from using the "timestamp"
-				# directive.
-				if ((defined $timesource{$current} && $timesource{$current} eq $value)
-				    || $time > $time{$current})
-				{
-					$time{$current} = $time;
-				}
-			}
-		}
-		else
-		{
-			die "Parse error: $line\n ";
-		}
-	}
-	else
-	{
-		# Commit message
-		my $current = $revmap{$rev};
-		if (defined $message{$current})
-		{
-			$message{$current} .= "\n";
-		}
-		$message{$current} .= $line;
-	}
-}
-close CFG;
-
-# Start spewing out data for git-fast-import
-foreach my $commit (@revs)
-{
-	# Progress
-	print OUT "progress Creating revision $commit\n";
-
-	# Create commit header
-	my $mark = $revmap{$commit};
-
-	# Branch and commit id
-	print OUT "commit refs/heads/", $branch{$mark}, "\nmark :", $mark, "\n";
-
-	# Author and timestamp
-	die "No timestamp defined for $commit (no files?)\n" unless defined $time{$mark};
-	print OUT "committer ", $author{$mark}, " ", $time{$mark}, " +0100\n";
-
-	# Commit message
-	die "No message defined for $commit\n" unless defined $message{$mark};
-	my $message = $message{$mark};
-	$message =~ s/\n$//; # Kill trailing empty line
-	print OUT "data ", length($message), "\n", $message, "\n";
-
-	# Parent and any merges
-	print OUT "from :", $revmap{$parent{$mark}}, "\n" if defined $parent{$mark};
-	if (defined $merges{$mark})
-	{
-		foreach my $merge (@{$merges{$mark}})
-		{
-			print OUT "merge :", $revmap{$merge}, "\n";
-		}
-	}
-
-	# Output file marks
-	print OUT "deleteall\n"; # start from scratch
-	foreach my $file (sort keys %{$files{$mark}})
-	{
-		print OUT "M 644 :", ${$files{$mark}}{$file}, " $file\n";
-	}
-	print OUT "\n";
-}
-
-# Create one file blob
-sub fileblob
-{
-	my ($filename, $crlfmode, $mark) = @_;
-
-	# Import the file
-	print OUT "progress Importing $filename\nblob\nmark :$mark\n";
-	open FILE, '<', $filename or die "Cannot read $filename\n ";
-	binmode FILE;
-	my ($size, $mtime) = (stat(FILE))[7,9];
-	my $file;
-	read FILE, $file, $size;
-	close FILE;
-	$file =~ s/\r\n/\n/g if $crlfmode;
-	print OUT "data ", length($file), "\n", $file, "\n";
-
-	return $mtime;
-}
-
-# Parse a key=value pair
-sub parsekeyvaluepair
-{
-=pod
-
-=head2 Escaping special characters
-
-Key and value strings may be enclosed in quotes, in which case
-whitespace inside the quotes is preserved. Additionally, an equal
-sign may be included in the key by preceding it with a backslash.
-For example:
-
- "key1 "=value1
- key2=" value2"
- key\=3=value3
- key4=value=4
- "key5""=value5
-
-Here the first key is "key1 " (note the trailing white-space) and the
-second value is " value2" (note the leading white-space). The third
-key contains an equal sign "key=3" and so does the fourth value, which
-does not need to be escaped. The fifth key contains a trailing quote,
-which does not need to be escaped since it is inside a surrounding
-quote.
-
-=cut
-	my $pair = shift;
-
-	# Separate key and value by the first non-quoted equal sign
-	my ($key, $value);
-	if ($pair =~ /^(.*[^\\])=(.*)$/)
-	{
-		($key, $value) = ($1, $2)
-	}
-	else
-	{
-		die "Parse error: $pair\n ";
-	}
-
-	# Unquote and unescape the key and value separately
-	return (&unescape($key), &unescape($value));
-}
-
-# Unquote and unescape
-sub unescape
-{
-	my $string = shift;
-
-	# First remove enclosing quotes. Backslash before the trailing
-	# quote leaves both.
-	if ($string =~ /^"(.*[^\\])"$/)
-	{
-		$string = $1;
-	}
-
-	# Second remove any backslashes inside the unquoted string.
-	# For later: Handle special sequences like \t ?
-	$string =~ s/\\(.)/$1/g;
-
-	return $string;
-}
-
-__END__
-
-=pod
-
-=head1 EXAMPLES
-
-B<import-directories.perl> F<project.import>
-
-=head1 AUTHOR
-
-Copyright 2008-2009 Peter Krefting E<lt>peter@softwolves.pp.se>
-
-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.
-
-=cut
diff --git a/contrib/fast-import/import-tars.perl b/contrib/fast-import/import-tars.perl
deleted file mode 100755
index 95438e1..0000000
--- a/contrib/fast-import/import-tars.perl
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/perl
-
-## tar archive frontend for git-fast-import
-##
-## For example:
-##
-##  mkdir project; cd project; git init
-##  perl import-tars.perl *.tar.bz2
-##  git whatchanged import-tars
-##
-## Use --metainfo to specify the extension for a meta data file, where
-## import-tars can read the commit message and optionally author and
-## committer information.
-##
-##  echo 'This is the commit message' > myfile.tar.bz2.msg
-##  perl import-tars.perl --metainfo=msg myfile.tar.bz2
-
-use strict;
-use Getopt::Long;
-
-my $metaext = '';
-
-die "usage: import-tars [--metainfo=extension] *.tar.{gz,bz2,lzma,xz,Z}\n"
-	unless GetOptions('metainfo=s' => \$metaext) && @ARGV;
-
-my $branch_name = 'import-tars';
-my $branch_ref = "refs/heads/$branch_name";
-my $author_name = $ENV{'GIT_AUTHOR_NAME'} || 'T Ar Creator';
-my $author_email = $ENV{'GIT_AUTHOR_EMAIL'} || 'tar@example.com';
-my $committer_name = $ENV{'GIT_COMMITTER_NAME'} || `git config --get user.name`;
-my $committer_email = $ENV{'GIT_COMMITTER_EMAIL'} || `git config --get user.email`;
-
-chomp($committer_name, $committer_email);
-
-open(FI, '|-', 'git', 'fast-import', '--quiet')
-	or die "Unable to start git fast-import: $!\n";
-foreach my $tar_file (@ARGV)
-{
-	my $commit_time = time;
-	$tar_file =~ m,([^/]+)$,;
-	my $tar_name = $1;
-
-	if ($tar_name =~ s/\.(tar\.gz|tgz)$//) {
-		open(I, '-|', 'gunzip', '-c', $tar_file)
-			or die "Unable to gunzip -c $tar_file: $!\n";
-	} elsif ($tar_name =~ s/\.(tar\.bz2|tbz2)$//) {
-		open(I, '-|', 'bunzip2', '-c', $tar_file)
-			or die "Unable to bunzip2 -c $tar_file: $!\n";
-	} elsif ($tar_name =~ s/\.tar\.Z$//) {
-		open(I, '-|', 'uncompress', '-c', $tar_file)
-			or die "Unable to uncompress -c $tar_file: $!\n";
-	} elsif ($tar_name =~ s/\.(tar\.(lzma|xz)|(tlz|txz))$//) {
-		open(I, '-|', 'xz', '-dc', $tar_file)
-			or die "Unable to xz -dc $tar_file: $!\n";
-	} elsif ($tar_name =~ s/\.tar$//) {
-		open(I, $tar_file) or die "Unable to open $tar_file: $!\n";
-	} else {
-		die "Unrecognized compression format: $tar_file\n";
-	}
-
-	my $author_time = 0;
-	my $next_mark = 1;
-	my $have_top_dir = 1;
-	my ($top_dir, %files);
-
-	while (read(I, $_, 512) == 512) {
-		my ($name, $mode, $uid, $gid, $size, $mtime,
-			$chksum, $typeflag, $linkname, $magic,
-			$version, $uname, $gname, $devmajor, $devminor,
-			$prefix) = unpack 'Z100 Z8 Z8 Z8 Z12 Z12
-			Z8 Z1 Z100 Z6
-			Z2 Z32 Z32 Z8 Z8 Z*', $_;
-		last unless length($name);
-		if ($name eq '././@LongLink') {
-			# GNU tar extension
-			if (read(I, $_, 512) != 512) {
-				die ('Short archive');
-			}
-			$name = unpack 'Z257', $_;
-			next unless $name;
-
-			my $dummy;
-			if (read(I, $_, 512) != 512) {
-				die ('Short archive');
-			}
-			($dummy, $mode, $uid, $gid, $size, $mtime,
-			$chksum, $typeflag, $linkname, $magic,
-			$version, $uname, $gname, $devmajor, $devminor,
-			$prefix) = unpack 'Z100 Z8 Z8 Z8 Z12 Z12
-			Z8 Z1 Z100 Z6
-			Z2 Z32 Z32 Z8 Z8 Z*', $_;
-		}
-		next if $name =~ m{/\z};
-		$mode = oct $mode;
-		$size = oct $size;
-		$mtime = oct $mtime;
-		next if $typeflag == 5; # directory
-
-		print FI "blob\n", "mark :$next_mark\n";
-		if ($typeflag == 2) { # symbolic link
-			print FI "data ", length($linkname), "\n", $linkname;
-			$mode = 0120000;
-		} else {
-			print FI "data $size\n";
-			while ($size > 0 && read(I, $_, 512) == 512) {
-				print FI substr($_, 0, $size);
-				$size -= 512;
-			}
-		}
-		print FI "\n";
-
-		my $path;
-		if ($prefix) {
-			$path = "$prefix/$name";
-		} else {
-			$path = "$name";
-		}
-		$files{$path} = [$next_mark++, $mode];
-
-		$author_time = $mtime if $mtime > $author_time;
-		$path =~ m,^([^/]+)/,;
-		$top_dir = $1 unless $top_dir;
-		$have_top_dir = 0 if $top_dir ne $1;
-	}
-
-	my $commit_msg = "Imported from $tar_file.";
-	my $this_committer_name = $committer_name;
-	my $this_committer_email = $committer_email;
-	my $this_author_name = $author_name;
-	my $this_author_email = $author_email;
-	if ($metaext ne '') {
-		# Optionally read a commit message from <filename.tar>.msg
-		# Add a line on the form "Committer: name <e-mail>" to override
-		# the committer and "Author: name <e-mail>" to override the
-		# author for this tar ball.
-		if (open MSG, '<', "${tar_file}.${metaext}") {
-			my $header_done = 0;
-			$commit_msg = '';
-			while (<MSG>) {
-				if (!$header_done && /^Committer:\s+([^<>]*)\s+<(.*)>\s*$/i) {
-					$this_committer_name = $1;
-					$this_committer_email = $2;
-				} elsif (!$header_done && /^Author:\s+([^<>]*)\s+<(.*)>\s*$/i) {
-					$this_author_name = $1;
-					$this_author_email = $2;
-				} elsif (!$header_done && /^$/) { # empty line ends header.
-					$header_done = 1;
-				} else {
-					$commit_msg .= $_;
-					$header_done = 1;
-				}
-			}
-			close MSG;
-		}
-	}
-
-	print FI <<EOF;
-commit $branch_ref
-author $this_author_name <$this_author_email> $author_time +0000
-committer $this_committer_name <$this_committer_email> $commit_time +0000
-data <<END_OF_COMMIT_MESSAGE
-$commit_msg
-END_OF_COMMIT_MESSAGE
-
-deleteall
-EOF
-
-	foreach my $path (keys %files)
-	{
-		my ($mark, $mode) = @{$files{$path}};
-		$path =~ s,^([^/]+)/,, if $have_top_dir;
-		$mode = $mode & 0111 ? 0755 : 0644 unless $mode == 0120000;
-		printf FI "M %o :%i %s\n", $mode, $mark, $path;
-	}
-	print FI "\n";
-
-	print FI <<EOF;
-tag $tar_name
-from $branch_ref
-tagger $author_name <$author_email> $author_time +0000
-data <<END_OF_TAG_MESSAGE
-Package $tar_name
-END_OF_TAG_MESSAGE
-
-EOF
-
-	close I;
-}
-close FI;
diff --git a/contrib/fast-import/import-zips.py b/contrib/fast-import/import-zips.py
deleted file mode 100755
index d12c296..0000000
--- a/contrib/fast-import/import-zips.py
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env python
-
-## zip archive frontend for git-fast-import
-##
-## For example:
-##
-##  mkdir project; cd project; git init
-##  python import-zips.py *.zip
-##  git log --stat import-zips
-
-from os import popen, path
-from sys import argv, exit, hexversion, stderr
-from time import mktime
-from zipfile import ZipFile
-
-if hexversion < 0x01060000:
-    # The limiter is the zipfile module
-    stderr.write("import-zips.py: requires Python 1.6.0 or later.\n")
-    exit(1)
-
-if len(argv) < 2:
-    print 'usage:', argv[0], '<zipfile>...'
-    exit(1)
-
-branch_ref = 'refs/heads/import-zips'
-committer_name = 'Z Ip Creator'
-committer_email = 'zip@example.com'
-
-fast_import = popen('git fast-import --quiet', 'w')
-def printlines(list):
-    for str in list:
-        fast_import.write(str + "\n")
-
-for zipfile in argv[1:]:
-    commit_time = 0
-    next_mark = 1
-    common_prefix = None
-    mark = dict()
-
-    zip = ZipFile(zipfile, 'r')
-    for name in zip.namelist():
-        if name.endswith('/'):
-            continue
-        info = zip.getinfo(name)
-
-        if commit_time < info.date_time:
-            commit_time = info.date_time
-        if common_prefix == None:
-            common_prefix = name[:name.rfind('/') + 1]
-        else:
-            while not name.startswith(common_prefix):
-                last_slash = common_prefix[:-1].rfind('/') + 1
-                common_prefix = common_prefix[:last_slash]
-
-        mark[name] = ':' + str(next_mark)
-        next_mark += 1
-
-        printlines(('blob', 'mark ' + mark[name], \
-                    'data ' + str(info.file_size)))
-        fast_import.write(zip.read(name) + "\n")
-
-    committer = committer_name + ' <' + committer_email + '> %d +0000' % \
-        mktime(commit_time + (0, 0, 0))
-
-    printlines(('commit ' + branch_ref, 'committer ' + committer, \
-        'data <<EOM', 'Imported from ' + zipfile + '.', 'EOM', \
-        '', 'deleteall'))
-
-    for name in mark.keys():
-        fast_import.write('M 100644 ' + mark[name] + ' ' +
-            name[len(common_prefix):] + "\n")
-
-    printlines(('',  'tag ' + path.basename(zipfile), \
-        'from ' + branch_ref, 'tagger ' + committer, \
-        'data <<EOM', 'Package ' + zipfile, 'EOM', ''))
-
-if fast_import.close():
-    exit(1)
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* [PATCH v1 24/25] contrib: remove 'hooks'
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (19 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 22/25] contrib: remove 'fast-import' Felipe Contreras
@ 2014-05-09  0:58 ` Felipe Contreras
  2014-05-09  1:47 ` [PATCH v1 00/25] contrib: cleanup Martin Langhoff
                   ` (4 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  0:58 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Felipe Contreras, Gerrit Pape, Shawn O. Pearce,
	Andy Parkins

No activity since 2008, no tests, no documentation.

Cc: Gerrit Pape <pape@smarden.org>
Cc: Shawn O. Pearce <spearce@spearce.org>
Cc: Andy Parkins <andyparkins@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/hooks/post-receive-email  | 759 --------------------------------------
 contrib/hooks/pre-auto-gc-battery |  42 ---
 contrib/hooks/setgitperms.perl    | 214 -----------
 contrib/hooks/update-paranoid     | 421 ---------------------
 4 files changed, 1436 deletions(-)
 delete mode 100755 contrib/hooks/post-receive-email
 delete mode 100755 contrib/hooks/pre-auto-gc-battery
 delete mode 100755 contrib/hooks/setgitperms.perl
 delete mode 100755 contrib/hooks/update-paranoid

diff --git a/contrib/hooks/post-receive-email b/contrib/hooks/post-receive-email
deleted file mode 100755
index 8747b84..0000000
--- a/contrib/hooks/post-receive-email
+++ /dev/null
@@ -1,759 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2007 Andy Parkins
-#
-# An example hook script to mail out commit update information.
-#
-# NOTE: This script is no longer under active development.  There
-# is another script, git-multimail, which is more capable and
-# configurable and is largely backwards-compatible with this script;
-# please see "contrib/hooks/multimail/".  For instructions on how to
-# migrate from post-receive-email to git-multimail, please see
-# "README.migrate-from-post-receive-email" in that directory.
-#
-# This hook sends emails listing new revisions to the repository
-# introduced by the change being reported.  The rule is that (for
-# branch updates) each commit will appear on one email and one email
-# only.
-#
-# This hook is stored in the contrib/hooks directory.  Your distribution
-# will have put this somewhere standard.  You should make this script
-# executable then link to it in the repository you would like to use it in.
-# For example, on debian the hook is stored in
-# /usr/share/git-core/contrib/hooks/post-receive-email:
-#
-#  cd /path/to/your/repository.git
-#  ln -sf /usr/share/git-core/contrib/hooks/post-receive-email hooks/post-receive
-#
-# This hook script assumes it is enabled on the central repository of a
-# project, with all users pushing only to it and not between each other.  It
-# will still work if you don't operate in that style, but it would become
-# possible for the email to be from someone other than the person doing the
-# push.
-#
-# To help with debugging and use on pre-v1.5.1 git servers, this script will
-# also obey the interface of hooks/update, taking its arguments on the
-# command line.  Unfortunately, hooks/update is called once for each ref.
-# To avoid firing one email per ref, this script just prints its output to
-# the screen when used in this mode.  The output can then be redirected if
-# wanted.
-#
-# Config
-# ------
-# hooks.mailinglist
-#   This is the list that all pushes will go to; leave it blank to not send
-#   emails for every ref update.
-# hooks.announcelist
-#   This is the list that all pushes of annotated tags will go to.  Leave it
-#   blank to default to the mailinglist field.  The announce emails lists
-#   the short log summary of the changes since the last annotated tag.
-# hooks.envelopesender
-#   If set then the -f option is passed to sendmail to allow the envelope
-#   sender address to be set
-# hooks.emailprefix
-#   All emails have their subjects prefixed with this prefix, or "[SCM]"
-#   if emailprefix is unset, to aid filtering
-# hooks.showrev
-#   The shell command used to format each revision in the email, with
-#   "%s" replaced with the commit id.  Defaults to "git rev-list -1
-#   --pretty %s", displaying the commit id, author, date and log
-#   message.  To list full patches separated by a blank line, you
-#   could set this to "git show -C %s; echo".
-#   To list a gitweb/cgit URL *and* a full patch for each change set, use this:
-#     "t=%s; printf 'http://.../?id=%%s' \$t; echo;echo; git show -C \$t; echo"
-#   Be careful if "..." contains things that will be expanded by shell "eval"
-#   or printf.
-# hooks.emailmaxlines
-#   The maximum number of lines that should be included in the generated
-#   email body. If not specified, there is no limit.
-#   Lines beyond the limit are suppressed and counted, and a final
-#   line is added indicating the number of suppressed lines.
-# hooks.diffopts
-#   Alternate options for the git diff-tree invocation that shows changes.
-#   Default is "--stat --summary --find-copies-harder". Add -p to those
-#   options to include a unified diff of changes in addition to the usual
-#   summary output.
-#
-# Notes
-# -----
-# All emails include the headers "X-Git-Refname", "X-Git-Oldrev",
-# "X-Git-Newrev", and "X-Git-Reftype" to enable fine tuned filtering and
-# give information for debugging.
-#
-
-# ---------------------------- Functions
-
-#
-# Function to prepare for email generation. This decides what type
-# of update this is and whether an email should even be generated.
-#
-prep_for_email()
-{
-	# --- Arguments
-	oldrev=$(git rev-parse $1)
-	newrev=$(git rev-parse $2)
-	refname="$3"
-
-	# --- Interpret
-	# 0000->1234 (create)
-	# 1234->2345 (update)
-	# 2345->0000 (delete)
-	if expr "$oldrev" : '0*$' >/dev/null
-	then
-		change_type="create"
-	else
-		if expr "$newrev" : '0*$' >/dev/null
-		then
-			change_type="delete"
-		else
-			change_type="update"
-		fi
-	fi
-
-	# --- Get the revision types
-	newrev_type=$(git cat-file -t $newrev 2> /dev/null)
-	oldrev_type=$(git cat-file -t "$oldrev" 2> /dev/null)
-	case "$change_type" in
-	create|update)
-		rev="$newrev"
-		rev_type="$newrev_type"
-		;;
-	delete)
-		rev="$oldrev"
-		rev_type="$oldrev_type"
-		;;
-	esac
-
-	# The revision type tells us what type the commit is, combined with
-	# the location of the ref we can decide between
-	#  - working branch
-	#  - tracking branch
-	#  - unannoted tag
-	#  - annotated tag
-	case "$refname","$rev_type" in
-		refs/tags/*,commit)
-			# un-annotated tag
-			refname_type="tag"
-			short_refname=${refname##refs/tags/}
-			;;
-		refs/tags/*,tag)
-			# annotated tag
-			refname_type="annotated tag"
-			short_refname=${refname##refs/tags/}
-			# change recipients
-			if [ -n "$announcerecipients" ]; then
-				recipients="$announcerecipients"
-			fi
-			;;
-		refs/heads/*,commit)
-			# branch
-			refname_type="branch"
-			short_refname=${refname##refs/heads/}
-			;;
-		refs/remotes/*,commit)
-			# tracking branch
-			refname_type="tracking branch"
-			short_refname=${refname##refs/remotes/}
-			echo >&2 "*** Push-update of tracking branch, $refname"
-			echo >&2 "***  - no email generated."
-			return 1
-			;;
-		*)
-			# Anything else (is there anything else?)
-			echo >&2 "*** Unknown type of update to $refname ($rev_type)"
-			echo >&2 "***  - no email generated"
-			return 1
-			;;
-	esac
-
-	# Check if we've got anyone to send to
-	if [ -z "$recipients" ]; then
-		case "$refname_type" in
-			"annotated tag")
-				config_name="hooks.announcelist"
-				;;
-			*)
-				config_name="hooks.mailinglist"
-				;;
-		esac
-		echo >&2 "*** $config_name is not set so no email will be sent"
-		echo >&2 "*** for $refname update $oldrev->$newrev"
-		return 1
-	fi
-
-	return 0
-}
-
-#
-# Top level email generation function.  This calls the appropriate
-# body-generation routine after outputting the common header.
-#
-# Note this function doesn't actually generate any email output, that is
-# taken care of by the functions it calls:
-#  - generate_email_header
-#  - generate_create_XXXX_email
-#  - generate_update_XXXX_email
-#  - generate_delete_XXXX_email
-#  - generate_email_footer
-#
-# Note also that this function cannot 'exit' from the script; when this
-# function is running (in hook script mode), the send_mail() function
-# is already executing in another process, connected via a pipe, and
-# if this function exits without, whatever has been generated to that
-# point will be sent as an email... even if nothing has been generated.
-#
-generate_email()
-{
-	# Email parameters
-	# The email subject will contain the best description of the ref
-	# that we can build from the parameters
-	describe=$(git describe $rev 2>/dev/null)
-	if [ -z "$describe" ]; then
-		describe=$rev
-	fi
-
-	generate_email_header
-
-	# Call the correct body generation function
-	fn_name=general
-	case "$refname_type" in
-	"tracking branch"|branch)
-		fn_name=branch
-		;;
-	"annotated tag")
-		fn_name=atag
-		;;
-	esac
-
-	if [ -z "$maxlines" ]; then
-		generate_${change_type}_${fn_name}_email
-	else
-		generate_${change_type}_${fn_name}_email | limit_lines $maxlines
-	fi
-
-	generate_email_footer
-}
-
-generate_email_header()
-{
-	# --- Email (all stdout will be the email)
-	# Generate header
-	cat <<-EOF
-	To: $recipients
-	Subject: ${emailprefix}$projectdesc $refname_type $short_refname ${change_type}d. $describe
-	MIME-Version: 1.0
-	Content-Type: text/plain; charset=utf-8
-	Content-Transfer-Encoding: 8bit
-	X-Git-Refname: $refname
-	X-Git-Reftype: $refname_type
-	X-Git-Oldrev: $oldrev
-	X-Git-Newrev: $newrev
-	Auto-Submitted: auto-generated
-
-	This is an automated email from the git hooks/post-receive script. It was
-	generated because a ref change was pushed to the repository containing
-	the project "$projectdesc".
-
-	The $refname_type, $short_refname has been ${change_type}d
-	EOF
-}
-
-generate_email_footer()
-{
-	SPACE=" "
-	cat <<-EOF
-
-
-	hooks/post-receive
-	--${SPACE}
-	$projectdesc
-	EOF
-}
-
-# --------------- Branches
-
-#
-# Called for the creation of a branch
-#
-generate_create_branch_email()
-{
-	# This is a new branch and so oldrev is not valid
-	echo "        at  $newrev ($newrev_type)"
-	echo ""
-
-	echo $LOGBEGIN
-	show_new_revisions
-	echo $LOGEND
-}
-
-#
-# Called for the change of a pre-existing branch
-#
-generate_update_branch_email()
-{
-	# Consider this:
-	#   1 --- 2 --- O --- X --- 3 --- 4 --- N
-	#
-	# O is $oldrev for $refname
-	# N is $newrev for $refname
-	# X is a revision pointed to by some other ref, for which we may
-	#   assume that an email has already been generated.
-	# In this case we want to issue an email containing only revisions
-	# 3, 4, and N.  Given (almost) by
-	#
-	#  git rev-list N ^O --not --all
-	#
-	# The reason for the "almost", is that the "--not --all" will take
-	# precedence over the "N", and effectively will translate to
-	#
-	#  git rev-list N ^O ^X ^N
-	#
-	# So, we need to build up the list more carefully.  git rev-parse
-	# will generate a list of revs that may be fed into git rev-list.
-	# We can get it to make the "--not --all" part and then filter out
-	# the "^N" with:
-	#
-	#  git rev-parse --not --all | grep -v N
-	#
-	# Then, using the --stdin switch to git rev-list we have effectively
-	# manufactured
-	#
-	#  git rev-list N ^O ^X
-	#
-	# This leaves a problem when someone else updates the repository
-	# while this script is running.  Their new value of the ref we're
-	# working on would be included in the "--not --all" output; and as
-	# our $newrev would be an ancestor of that commit, it would exclude
-	# all of our commits.  What we really want is to exclude the current
-	# value of $refname from the --not list, rather than N itself.  So:
-	#
-	#  git rev-parse --not --all | grep -v $(git rev-parse $refname)
-	#
-	# Get's us to something pretty safe (apart from the small time
-	# between refname being read, and git rev-parse running - for that,
-	# I give up)
-	#
-	#
-	# Next problem, consider this:
-	#   * --- B --- * --- O ($oldrev)
-	#          \
-	#           * --- X --- * --- N ($newrev)
-	#
-	# That is to say, there is no guarantee that oldrev is a strict
-	# subset of newrev (it would have required a --force, but that's
-	# allowed).  So, we can't simply say rev-list $oldrev..$newrev.
-	# Instead we find the common base of the two revs and list from
-	# there.
-	#
-	# As above, we need to take into account the presence of X; if
-	# another branch is already in the repository and points at some of
-	# the revisions that we are about to output - we don't want them.
-	# The solution is as before: git rev-parse output filtered.
-	#
-	# Finally, tags: 1 --- 2 --- O --- T --- 3 --- 4 --- N
-	#
-	# Tags pushed into the repository generate nice shortlog emails that
-	# summarise the commits between them and the previous tag.  However,
-	# those emails don't include the full commit messages that we output
-	# for a branch update.  Therefore we still want to output revisions
-	# that have been output on a tag email.
-	#
-	# Luckily, git rev-parse includes just the tool.  Instead of using
-	# "--all" we use "--branches"; this has the added benefit that
-	# "remotes/" will be ignored as well.
-
-	# List all of the revisions that were removed by this update, in a
-	# fast-forward update, this list will be empty, because rev-list O
-	# ^N is empty.  For a non-fast-forward, O ^N is the list of removed
-	# revisions
-	fast_forward=""
-	rev=""
-	for rev in $(git rev-list $newrev..$oldrev)
-	do
-		revtype=$(git cat-file -t "$rev")
-		echo "  discards  $rev ($revtype)"
-	done
-	if [ -z "$rev" ]; then
-		fast_forward=1
-	fi
-
-	# List all the revisions from baserev to newrev in a kind of
-	# "table-of-contents"; note this list can include revisions that
-	# have already had notification emails and is present to show the
-	# full detail of the change from rolling back the old revision to
-	# the base revision and then forward to the new revision
-	for rev in $(git rev-list $oldrev..$newrev)
-	do
-		revtype=$(git cat-file -t "$rev")
-		echo "       via  $rev ($revtype)"
-	done
-
-	if [ "$fast_forward" ]; then
-		echo "      from  $oldrev ($oldrev_type)"
-	else
-		#  1. Existing revisions were removed.  In this case newrev
-		#     is a subset of oldrev - this is the reverse of a
-		#     fast-forward, a rewind
-		#  2. New revisions were added on top of an old revision,
-		#     this is a rewind and addition.
-
-		# (1) certainly happened, (2) possibly.  When (2) hasn't
-		# happened, we set a flag to indicate that no log printout
-		# is required.
-
-		echo ""
-
-		# Find the common ancestor of the old and new revisions and
-		# compare it with newrev
-		baserev=$(git merge-base $oldrev $newrev)
-		rewind_only=""
-		if [ "$baserev" = "$newrev" ]; then
-			echo "This update discarded existing revisions and left the branch pointing at"
-			echo "a previous point in the repository history."
-			echo ""
-			echo " * -- * -- N ($newrev)"
-			echo "            \\"
-			echo "             O -- O -- O ($oldrev)"
-			echo ""
-			echo "The removed revisions are not necessarily gone - if another reference"
-			echo "still refers to them they will stay in the repository."
-			rewind_only=1
-		else
-			echo "This update added new revisions after undoing existing revisions.  That is"
-			echo "to say, the old revision is not a strict subset of the new revision.  This"
-			echo "situation occurs when you --force push a change and generate a repository"
-			echo "containing something like this:"
-			echo ""
-			echo " * -- * -- B -- O -- O -- O ($oldrev)"
-			echo "            \\"
-			echo "             N -- N -- N ($newrev)"
-			echo ""
-			echo "When this happens we assume that you've already had alert emails for all"
-			echo "of the O revisions, and so we here report only the revisions in the N"
-			echo "branch from the common base, B."
-		fi
-	fi
-
-	echo ""
-	if [ -z "$rewind_only" ]; then
-		echo "Those revisions listed above that are new to this repository have"
-		echo "not appeared on any other notification email; so we list those"
-		echo "revisions in full, below."
-
-		echo ""
-		echo $LOGBEGIN
-		show_new_revisions
-
-		# XXX: Need a way of detecting whether git rev-list actually
-		# outputted anything, so that we can issue a "no new
-		# revisions added by this update" message
-
-		echo $LOGEND
-	else
-		echo "No new revisions were added by this update."
-	fi
-
-	# The diffstat is shown from the old revision to the new revision.
-	# This is to show the truth of what happened in this change.
-	# There's no point showing the stat from the base to the new
-	# revision because the base is effectively a random revision at this
-	# point - the user will be interested in what this revision changed
-	# - including the undoing of previous revisions in the case of
-	# non-fast-forward updates.
-	echo ""
-	echo "Summary of changes:"
-	git diff-tree $diffopts $oldrev..$newrev
-}
-
-#
-# Called for the deletion of a branch
-#
-generate_delete_branch_email()
-{
-	echo "       was  $oldrev"
-	echo ""
-	echo $LOGBEGIN
-	git diff-tree -s --always --encoding=UTF-8 --pretty=oneline $oldrev
-	echo $LOGEND
-}
-
-# --------------- Annotated tags
-
-#
-# Called for the creation of an annotated tag
-#
-generate_create_atag_email()
-{
-	echo "        at  $newrev ($newrev_type)"
-
-	generate_atag_email
-}
-
-#
-# Called for the update of an annotated tag (this is probably a rare event
-# and may not even be allowed)
-#
-generate_update_atag_email()
-{
-	echo "        to  $newrev ($newrev_type)"
-	echo "      from  $oldrev (which is now obsolete)"
-
-	generate_atag_email
-}
-
-#
-# Called when an annotated tag is created or changed
-#
-generate_atag_email()
-{
-	# Use git for-each-ref to pull out the individual fields from the
-	# tag
-	eval $(git for-each-ref --shell --format='
-	tagobject=%(*objectname)
-	tagtype=%(*objecttype)
-	tagger=%(taggername)
-	tagged=%(taggerdate)' $refname
-	)
-
-	echo "   tagging  $tagobject ($tagtype)"
-	case "$tagtype" in
-	commit)
-
-		# If the tagged object is a commit, then we assume this is a
-		# release, and so we calculate which tag this tag is
-		# replacing
-		prevtag=$(git describe --abbrev=0 $newrev^ 2>/dev/null)
-
-		if [ -n "$prevtag" ]; then
-			echo "  replaces  $prevtag"
-		fi
-		;;
-	*)
-		echo "    length  $(git cat-file -s $tagobject) bytes"
-		;;
-	esac
-	echo " tagged by  $tagger"
-	echo "        on  $tagged"
-
-	echo ""
-	echo $LOGBEGIN
-
-	# Show the content of the tag message; this might contain a change
-	# log or release notes so is worth displaying.
-	git cat-file tag $newrev | sed -e '1,/^$/d'
-
-	echo ""
-	case "$tagtype" in
-	commit)
-		# Only commit tags make sense to have rev-list operations
-		# performed on them
-		if [ -n "$prevtag" ]; then
-			# Show changes since the previous release
-			git shortlog "$prevtag..$newrev"
-		else
-			# No previous tag, show all the changes since time
-			# began
-			git shortlog $newrev
-		fi
-		;;
-	*)
-		# XXX: Is there anything useful we can do for non-commit
-		# objects?
-		;;
-	esac
-
-	echo $LOGEND
-}
-
-#
-# Called for the deletion of an annotated tag
-#
-generate_delete_atag_email()
-{
-	echo "       was  $oldrev"
-	echo ""
-	echo $LOGBEGIN
-	git diff-tree -s --always --encoding=UTF-8 --pretty=oneline $oldrev
-	echo $LOGEND
-}
-
-# --------------- General references
-
-#
-# Called when any other type of reference is created (most likely a
-# non-annotated tag)
-#
-generate_create_general_email()
-{
-	echo "        at  $newrev ($newrev_type)"
-
-	generate_general_email
-}
-
-#
-# Called when any other type of reference is updated (most likely a
-# non-annotated tag)
-#
-generate_update_general_email()
-{
-	echo "        to  $newrev ($newrev_type)"
-	echo "      from  $oldrev"
-
-	generate_general_email
-}
-
-#
-# Called for creation or update of any other type of reference
-#
-generate_general_email()
-{
-	# Unannotated tags are more about marking a point than releasing a
-	# version; therefore we don't do the shortlog summary that we do for
-	# annotated tags above - we simply show that the point has been
-	# marked, and print the log message for the marked point for
-	# reference purposes
-	#
-	# Note this section also catches any other reference type (although
-	# there aren't any) and deals with them in the same way.
-
-	echo ""
-	if [ "$newrev_type" = "commit" ]; then
-		echo $LOGBEGIN
-		git diff-tree -s --always --encoding=UTF-8 --pretty=medium $newrev
-		echo $LOGEND
-	else
-		# What can we do here?  The tag marks an object that is not
-		# a commit, so there is no log for us to display.  It's
-		# probably not wise to output git cat-file as it could be a
-		# binary blob.  We'll just say how big it is
-		echo "$newrev is a $newrev_type, and is $(git cat-file -s $newrev) bytes long."
-	fi
-}
-
-#
-# Called for the deletion of any other type of reference
-#
-generate_delete_general_email()
-{
-	echo "       was  $oldrev"
-	echo ""
-	echo $LOGBEGIN
-	git diff-tree -s --always --encoding=UTF-8 --pretty=oneline $oldrev
-	echo $LOGEND
-}
-
-
-# --------------- Miscellaneous utilities
-
-#
-# Show new revisions as the user would like to see them in the email.
-#
-show_new_revisions()
-{
-	# This shows all log entries that are not already covered by
-	# another ref - i.e. commits that are now accessible from this
-	# ref that were previously not accessible
-	# (see generate_update_branch_email for the explanation of this
-	# command)
-
-	# Revision range passed to rev-list differs for new vs. updated
-	# branches.
-	if [ "$change_type" = create ]
-	then
-		# Show all revisions exclusive to this (new) branch.
-		revspec=$newrev
-	else
-		# Branch update; show revisions not part of $oldrev.
-		revspec=$oldrev..$newrev
-	fi
-
-	other_branches=$(git for-each-ref --format='%(refname)' refs/heads/ |
-	    grep -F -v $refname)
-	git rev-parse --not $other_branches |
-	if [ -z "$custom_showrev" ]
-	then
-		git rev-list --pretty --stdin $revspec
-	else
-		git rev-list --stdin $revspec |
-		while read onerev
-		do
-			eval $(printf "$custom_showrev" $onerev)
-		done
-	fi
-}
-
-
-limit_lines()
-{
-	lines=0
-	skipped=0
-	while IFS="" read -r line; do
-		lines=$((lines + 1))
-		if [ $lines -gt $1 ]; then
-			skipped=$((skipped + 1))
-		else
-			printf "%s\n" "$line"
-		fi
-	done
-	if [ $skipped -ne 0 ]; then
-		echo "... $skipped lines suppressed ..."
-	fi
-}
-
-
-send_mail()
-{
-	if [ -n "$envelopesender" ]; then
-		/usr/sbin/sendmail -t -f "$envelopesender"
-	else
-		/usr/sbin/sendmail -t
-	fi
-}
-
-# ---------------------------- main()
-
-# --- Constants
-LOGBEGIN="- Log -----------------------------------------------------------------"
-LOGEND="-----------------------------------------------------------------------"
-
-# --- Config
-# Set GIT_DIR either from the working directory, or from the environment
-# variable.
-GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
-if [ -z "$GIT_DIR" ]; then
-	echo >&2 "fatal: post-receive: GIT_DIR not set"
-	exit 1
-fi
-
-projectdesc=$(sed -ne '1p' "$GIT_DIR/description" 2>/dev/null)
-# Check if the description is unchanged from it's default, and shorten it to
-# a more manageable length if it is
-if expr "$projectdesc" : "Unnamed repository.*$" >/dev/null
-then
-	projectdesc="UNNAMED PROJECT"
-fi
-
-recipients=$(git config hooks.mailinglist)
-announcerecipients=$(git config hooks.announcelist)
-envelopesender=$(git config hooks.envelopesender)
-emailprefix=$(git config hooks.emailprefix || echo '[SCM] ')
-custom_showrev=$(git config hooks.showrev)
-maxlines=$(git config hooks.emailmaxlines)
-diffopts=$(git config hooks.diffopts)
-: ${diffopts:="--stat --summary --find-copies-harder"}
-
-# --- Main loop
-# Allow dual mode: run from the command line just like the update hook, or
-# if no arguments are given then run as a hook script
-if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
-	# Output to the terminal in command line mode - if someone wanted to
-	# resend an email; they could redirect the output to sendmail
-	# themselves
-	prep_for_email $2 $3 $1 && PAGER= generate_email
-else
-	while read oldrev newrev refname
-	do
-		prep_for_email $oldrev $newrev $refname || continue
-		generate_email $maxlines | send_mail
-	done
-fi
diff --git a/contrib/hooks/pre-auto-gc-battery b/contrib/hooks/pre-auto-gc-battery
deleted file mode 100755
index 9d0c2d1..0000000
--- a/contrib/hooks/pre-auto-gc-battery
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/sh
-#
-# An example hook script to verify if you are on battery, in case you
-# are running Linux or OS X. Called by git-gc --auto with no arguments.
-# The hook should exit with non-zero status after issuing an appropriate
-# message if it wants to stop the auto repacking.
-#
-# This hook is stored in the contrib/hooks directory. Your distribution
-# may have put this somewhere else. If you want to use this hook, you
-# should make this script executable then link to it in the repository
-# you would like to use it in.
-#
-# For example, if the hook is stored in
-# /usr/share/git-core/contrib/hooks/pre-auto-gc-battery:
-#
-# cd /path/to/your/repository.git
-# ln -sf /usr/share/git-core/contrib/hooks/pre-auto-gc-battery \
-#	hooks/pre-auto-gc
-
-if test -x /sbin/on_ac_power && /sbin/on_ac_power
-then
-	exit 0
-elif test "$(cat /sys/class/power_supply/AC/online 2>/dev/null)" = 1
-then
-	exit 0
-elif grep -q 'on-line' /proc/acpi/ac_adapter/AC/state 2>/dev/null
-then
-	exit 0
-elif grep -q '0x01$' /proc/apm 2>/dev/null
-then
-	exit 0
-elif grep -q "AC Power \+: 1" /proc/pmu/info 2>/dev/null
-then
-	exit 0
-elif test -x /usr/bin/pmset && /usr/bin/pmset -g batt |
-	grep -q "Currently drawing from 'AC Power'"
-then
-	exit 0
-fi
-
-echo "Auto packing deferred; not on AC"
-exit 1
diff --git a/contrib/hooks/setgitperms.perl b/contrib/hooks/setgitperms.perl
deleted file mode 100755
index 2770a1b..0000000
--- a/contrib/hooks/setgitperms.perl
+++ /dev/null
@@ -1,214 +0,0 @@
-#!/usr/bin/perl
-#
-# Copyright (c) 2006 Josh England
-#
-# This script can be used to save/restore full permissions and ownership data
-# within a git working tree.
-#
-# To save permissions/ownership data, place this script in your .git/hooks
-# directory and enable a `pre-commit` hook with the following lines:
-#      #!/bin/sh
-#     SUBDIRECTORY_OK=1 . git-sh-setup
-#     $GIT_DIR/hooks/setgitperms.perl -r
-#
-# To restore permissions/ownership data, place this script in your .git/hooks
-# directory and enable a `post-merge` and `post-checkout` hook with the
-# following lines:
-#      #!/bin/sh
-#     SUBDIRECTORY_OK=1 . git-sh-setup
-#     $GIT_DIR/hooks/setgitperms.perl -w
-#
-use strict;
-use Getopt::Long;
-use File::Find;
-use File::Basename;
-
-my $usage =
-"usage: setgitperms.perl [OPTION]... <--read|--write>
-This program uses a file `.gitmeta` to store/restore permissions and uid/gid
-info for all files/dirs tracked by git in the repository.
-
----------------------------------Read Mode-------------------------------------
--r,  --read         Reads perms/etc from working dir into a .gitmeta file
--s,  --stdout       Output to stdout instead of .gitmeta
--d,  --diff         Show unified diff of perms file (XOR with --stdout)
-
----------------------------------Write Mode------------------------------------
--w,  --write        Modify perms/etc in working dir to match the .gitmeta file
--v,  --verbose      Be verbose
-
-\n";
-
-my ($stdout, $showdiff, $verbose, $read_mode, $write_mode);
-
-if ((@ARGV < 0) || !GetOptions(
-			       "stdout",         \$stdout,
-			       "diff",           \$showdiff,
-			       "read",           \$read_mode,
-			       "write",          \$write_mode,
-			       "verbose",        \$verbose,
-			      )) { die $usage; }
-die $usage unless ($read_mode xor $write_mode);
-
-my $topdir = `git rev-parse --show-cdup` or die "\n"; chomp $topdir;
-my $gitdir = $topdir . '.git';
-my $gitmeta = $topdir . '.gitmeta';
-
-if ($write_mode) {
-    # Update the working dir permissions/ownership based on data from .gitmeta
-    open (IN, "<$gitmeta") or die "Could not open $gitmeta for reading: $!\n";
-    while (defined ($_ = <IN>)) {
-	chomp;
-	if (/^(.*)  mode=(\S+)\s+uid=(\d+)\s+gid=(\d+)/) {
-	    # Compare recorded perms to actual perms in the working dir
-	    my ($path, $mode, $uid, $gid) = ($1, $2, $3, $4);
-	    my $fullpath = $topdir . $path;
-	    my (undef,undef,$wmode,undef,$wuid,$wgid) = lstat($fullpath);
-	    $wmode = sprintf "%04o", $wmode & 07777;
-	    if ($mode ne $wmode) {
-		$verbose && print "Updating permissions on $path: old=$wmode, new=$mode\n";
-		chmod oct($mode), $fullpath;
-	    }
-	    if ($uid != $wuid || $gid != $wgid) {
-		if ($verbose) {
-		    # Print out user/group names instead of uid/gid
-		    my $pwname  = getpwuid($uid);
-		    my $grpname  = getgrgid($gid);
-		    my $wpwname  = getpwuid($wuid);
-		    my $wgrpname  = getgrgid($wgid);
-		    $pwname = $uid if !defined $pwname;
-		    $grpname = $gid if !defined $grpname;
-		    $wpwname = $wuid if !defined $wpwname;
-		    $wgrpname = $wgid if !defined $wgrpname;
-
-		    print "Updating uid/gid on $path: old=$wpwname/$wgrpname, new=$pwname/$grpname\n";
-		}
-		chown $uid, $gid, $fullpath;
-	    }
-	}
-	else {
-	    warn "Invalid input format in $gitmeta:\n\t$_\n";
-	}
-    }
-    close IN;
-}
-elsif ($read_mode) {
-    # Handle merge conflicts in the .gitperms file
-    if (-e "$gitdir/MERGE_MSG") {
-	if (`grep ====== $gitmeta`) {
-	    # Conflict not resolved -- abort the commit
-	    print "PERMISSIONS/OWNERSHIP CONFLICT\n";
-	    print "    Resolve the conflict in the $gitmeta file and then run\n";
-	    print "    `.git/hooks/setgitperms.perl --write` to reconcile.\n";
-	    exit 1;
-	}
-	elsif (`grep $gitmeta $gitdir/MERGE_MSG`) {
-	    # A conflict in .gitmeta has been manually resolved. Verify that
-	    # the working dir perms matches the current .gitmeta perms for
-	    # each file/dir that conflicted.
-	    # This is here because a `setgitperms.perl --write` was not
-	    # performed due to a merge conflict, so permissions/ownership
-	    # may not be consistent with the manually merged .gitmeta file.
-	    my @conflict_diff = `git show \$(cat $gitdir/MERGE_HEAD)`;
-	    my @conflict_files;
-	    my $metadiff = 0;
-
-	    # Build a list of files that conflicted from the .gitmeta diff
-	    foreach my $line (@conflict_diff) {
-		if ($line =~ m|^diff --git a/$gitmeta b/$gitmeta|) {
-		    $metadiff = 1;
-		}
-		elsif ($line =~ /^diff --git/) {
-		    $metadiff = 0;
-		}
-		elsif ($metadiff && $line =~ /^\+(.*)  mode=/) {
-		    push @conflict_files, $1;
-		}
-	    }
-
-	    # Verify that each conflict file now has permissions consistent
-	    # with the .gitmeta file
-	    foreach my $file (@conflict_files) {
-		my $absfile = $topdir . $file;
-		my $gm_entry = `grep "^$file  mode=" $gitmeta`;
-		if ($gm_entry =~ /mode=(\d+)  uid=(\d+)  gid=(\d+)/) {
-		    my ($gm_mode, $gm_uid, $gm_gid) = ($1, $2, $3);
-		    my (undef,undef,$mode,undef,$uid,$gid) = lstat("$absfile");
-		    $mode = sprintf("%04o", $mode & 07777);
-		    if (($gm_mode ne $mode) || ($gm_uid != $uid)
-			|| ($gm_gid != $gid)) {
-			print "PERMISSIONS/OWNERSHIP CONFLICT\n";
-			print "    Mismatch found for file: $file\n";
-			print "    Run `.git/hooks/setgitperms.perl --write` to reconcile.\n";
-			exit 1;
-		    }
-		}
-		else {
-		    print "Warning! Permissions/ownership no longer being tracked for file: $file\n";
-		}
-	    }
-	}
-    }
-
-    # No merge conflicts -- write out perms/ownership data to .gitmeta file
-    unless ($stdout) {
-	open (OUT, ">$gitmeta.tmp") or die "Could not open $gitmeta.tmp for writing: $!\n";
-    }
-
-    my @files = `git ls-files`;
-    my %dirs;
-
-    foreach my $path (@files) {
-	chomp $path;
-	# We have to manually add stats for parent directories
-	my $parent = dirname($path);
-	while (!exists $dirs{$parent}) {
-	    $dirs{$parent} = 1;
-	    next if $parent eq '.';
-	    printstats($parent);
-	    $parent = dirname($parent);
-	}
-	# Now the git-tracked file
-	printstats($path);
-    }
-
-    # diff the temporary metadata file to see if anything has changed
-    # If no metadata has changed, don't overwrite the real file
-    # This is just so `git commit -a` doesn't try to commit a bogus update
-    unless ($stdout) {
-	if (! -e $gitmeta) {
-	    rename "$gitmeta.tmp", $gitmeta;
-	}
-	else {
-	    my $diff = `diff -U 0 $gitmeta $gitmeta.tmp`;
-	    if ($diff ne '') {
-		rename "$gitmeta.tmp", $gitmeta;
-	    }
-	    else {
-		unlink "$gitmeta.tmp";
-	    }
-	    if ($showdiff) {
-		print $diff;
-	    }
-	}
-	close OUT;
-    }
-    # Make sure the .gitmeta file is tracked
-    system("git add $gitmeta");
-}
-
-
-sub printstats {
-    my $path = $_[0];
-    $path =~ s/@/\@/g;
-    my (undef,undef,$mode,undef,$uid,$gid) = lstat($path);
-    $path =~ s/%/\%/g;
-    if ($stdout) {
-	print $path;
-	printf "  mode=%04o  uid=$uid  gid=$gid\n", $mode & 07777;
-    }
-    else {
-	print OUT $path;
-	printf OUT "  mode=%04o  uid=$uid  gid=$gid\n", $mode & 07777;
-    }
-}
diff --git a/contrib/hooks/update-paranoid b/contrib/hooks/update-paranoid
deleted file mode 100755
index d18b317..0000000
--- a/contrib/hooks/update-paranoid
+++ /dev/null
@@ -1,421 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use File::Spec;
-
-$ENV{PATH}     = '/opt/git/bin';
-my $acl_git    = '/vcs/acls.git';
-my $acl_branch = 'refs/heads/master';
-my $debug      = 0;
-
-=doc
-Invoked as: update refname old-sha1 new-sha1
-
-This script is run by git-receive-pack once for each ref that the
-client is trying to modify.  If we exit with a non-zero exit value
-then the update for that particular ref is denied, but updates for
-other refs in the same run of receive-pack may still be allowed.
-
-We are run after the objects have been uploaded, but before the
-ref is actually modified.  We take advantage of that fact when we
-look for "new" commits and tags (the new objects won't show up in
-`rev-list --all`).
-
-This script loads and parses the content of the config file
-"users/$this_user.acl" from the $acl_branch commit of $acl_git ODB.
-The acl file is a git-config style file, but uses a slightly more
-restricted syntax as the Perl parser contained within this script
-is not nearly as permissive as git-config.
-
-Example:
-
-  [user]
-    committer = John Doe <john.doe@example.com>
-    committer = John R. Doe <john.doe@example.com>
-
-  [repository "acls"]
-    allow = heads/master
-    allow = CDUR for heads/jd/
-    allow = C    for ^tags/v\\d+$
-
-For all new commit or tag objects the committer (or tagger) line
-within the object must exactly match one of the user.committer
-values listed in the acl file ("HEAD:users/$this_user.acl").
-
-For a branch to be modified an allow line within the matching
-repository section must be matched for both the refname and the
-opcode.
-
-Repository sections are matched on the basename of the repository
-(after removing the .git suffix).
-
-The opcode abbrevations are:
-
-  C: create new ref
-  D: delete existing ref
-  U: fast-forward existing ref (no commit loss)
-  R: rewind/rebase existing ref (commit loss)
-
-if no opcodes are listed before the "for" keyword then "U" (for
-fast-forward update only) is assumed as this is the most common
-usage.
-
-Refnames are matched by always assuming a prefix of "refs/".
-This hook forbids pushing or deleting anything not under "refs/".
-
-Refnames that start with ^ are Perl regular expressions, and the ^
-is kept as part of the regexp.  \\ is needed to get just one \, so
-\\d expands to \d in Perl.  The 3rd allow line above is an example.
-
-Refnames that don't start with ^ but that end with / are prefix
-matches (2nd allow line above); all other refnames are strict
-equality matches (1st allow line).
-
-Anything pushed to "heads/" (ok, really "refs/heads/") must be
-a commit.  Tags are not permitted here.
-
-Anything pushed to "tags/" (err, really "refs/tags/") must be an
-annotated tag.  Commits, blobs, trees, etc. are not permitted here.
-Annotated tag signatures aren't checked, nor are they required.
-
-The special subrepository of 'info/new-commit-check' can
-be created and used to allow users to push new commits and
-tags from another local repository to this one, even if they
-aren't the committer/tagger of those objects.  In a nut shell
-the info/new-commit-check directory is a Git repository whose
-objects/info/alternates file lists this repository and all other
-possible sources, and whose refs subdirectory contains symlinks
-to this repository's refs subdirectory, and to all other possible
-sources refs subdirectories.  Yes, this means that you cannot
-use packed-refs in those repositories as they won't be resolved
-correctly.
-
-=cut
-
-my $git_dir = $ENV{GIT_DIR};
-my $new_commit_check = "$git_dir/info/new-commit-check";
-my $ref = $ARGV[0];
-my $old = $ARGV[1];
-my $new = $ARGV[2];
-my $new_type;
-my ($this_user) = getpwuid $<; # REAL_USER_ID
-my $repository_name;
-my %user_committer;
-my @allow_rules;
-my @path_rules;
-my %diff_cache;
-
-sub deny ($) {
-	print STDERR "-Deny-    $_[0]\n" if $debug;
-	print STDERR "\ndenied: $_[0]\n\n";
-	exit 1;
-}
-
-sub grant ($) {
-	print STDERR "-Grant-   $_[0]\n" if $debug;
-	exit 0;
-}
-
-sub info ($) {
-	print STDERR "-Info-    $_[0]\n" if $debug;
-}
-
-sub git_value (@) {
-	open(T,'-|','git',@_); local $_ = <T>; chop; close T; $_;
-}
-
-sub match_string ($$) {
-	my ($acl_n, $ref) = @_;
-	   ($acl_n eq $ref)
-	|| ($acl_n =~ m,/$, && substr($ref,0,length $acl_n) eq $acl_n)
-	|| ($acl_n =~ m,^\^, && $ref =~ m:$acl_n:);
-}
-
-sub parse_config ($$$$) {
-	my $data = shift;
-	local $ENV{GIT_DIR} = shift;
-	my $br = shift;
-	my $fn = shift;
-	return unless git_value('rev-list','--max-count=1',$br,'--',$fn);
-	info "Loading $br:$fn";
-	open(I,'-|','git','cat-file','blob',"$br:$fn");
-	my $section = '';
-	while (<I>) {
-		chomp;
-		if (/^\s*$/ || /^\s*#/) {
-		} elsif (/^\[([a-z]+)\]$/i) {
-			$section = lc $1;
-		} elsif (/^\[([a-z]+)\s+"(.*)"\]$/i) {
-			$section = join('.',lc $1,$2);
-		} elsif (/^\s*([a-z][a-z0-9]+)\s*=\s*(.*?)\s*$/i) {
-			push @{$data->{join('.',$section,lc $1)}}, $2;
-		} else {
-			deny "bad config file line $. in $br:$fn";
-		}
-	}
-	close I;
-}
-
-sub all_new_committers () {
-	local $ENV{GIT_DIR} = $git_dir;
-	$ENV{GIT_DIR} = $new_commit_check if -d $new_commit_check;
-
-	info "Getting committers of new commits.";
-	my %used;
-	open(T,'-|','git','rev-list','--pretty=raw',$new,'--not','--all');
-	while (<T>) {
-		next unless s/^committer //;
-		chop;
-		s/>.*$/>/;
-		info "Found $_." unless $used{$_}++;
-	}
-	close T;
-	info "No new commits." unless %used;
-	keys %used;
-}
-
-sub all_new_taggers () {
-	my %exists;
-	open(T,'-|','git','for-each-ref','--format=%(objectname)','refs/tags');
-	while (<T>) {
-		chop;
-		$exists{$_} = 1;
-	}
-	close T;
-
-	info "Getting taggers of new tags.";
-	my %used;
-	my $obj = $new;
-	my $obj_type = $new_type;
-	while ($obj_type eq 'tag') {
-		last if $exists{$obj};
-		$obj_type = '';
-		open(T,'-|','git','cat-file','tag',$obj);
-		while (<T>) {
-			chop;
-			if (/^object ([a-z0-9]{40})$/) {
-				$obj = $1;
-			} elsif (/^type (.+)$/) {
-				$obj_type = $1;
-			} elsif (s/^tagger //) {
-				s/>.*$/>/;
-				info "Found $_." unless $used{$_}++;
-				last;
-			}
-		}
-		close T;
-	}
-	info "No new tags." unless %used;
-	keys %used;
-}
-
-sub check_committers (@) {
-	my @bad;
-	foreach (@_) { push @bad, $_ unless $user_committer{$_}; }
-	if (@bad) {
-		print STDERR "\n";
-		print STDERR "You are not $_.\n" foreach (sort @bad);
-		deny "You cannot push changes not committed by you.";
-	}
-}
-
-sub load_diff ($) {
-	my $base = shift;
-	my $d = $diff_cache{$base};
-	unless ($d) {
-		local $/ = "\0";
-		my %this_diff;
-		if ($base =~ /^0{40}$/) {
-			# Don't load the diff at all; we are making the
-			# branch and have no base to compare to in this
-			# case.  A file level ACL makes no sense in this
-			# context.  Having an empty diff will allow the
-			# branch creation.
-			#
-		} else {
-			open(T,'-|','git','diff-tree',
-				'-r','--name-status','-z',
-				$base,$new) or return undef;
-			while (<T>) {
-				my $op = $_;
-				chop $op;
-
-				my $path = <T>;
-				chop $path;
-
-				$this_diff{$path} = $op;
-			}
-			close T or return undef;
-		}
-		$d = \%this_diff;
-		$diff_cache{$base} = $d;
-	}
-	return $d;
-}
-
-deny "No GIT_DIR inherited from caller" unless $git_dir;
-deny "Need a ref name" unless $ref;
-deny "Refusing funny ref $ref" unless $ref =~ s,^refs/,,;
-deny "Bad old value $old" unless $old =~ /^[a-z0-9]{40}$/;
-deny "Bad new value $new" unless $new =~ /^[a-z0-9]{40}$/;
-deny "Cannot determine who you are." unless $this_user;
-grant "No change requested." if $old eq $new;
-
-$repository_name = File::Spec->rel2abs($git_dir);
-$repository_name =~ m,/([^/]+)(?:\.git|/\.git)$,;
-$repository_name = $1;
-info "Updating in '$repository_name'.";
-
-my $op;
-if    ($old =~ /^0{40}$/) { $op = 'C'; }
-elsif ($new =~ /^0{40}$/) { $op = 'D'; }
-else                      { $op = 'R'; }
-
-# This is really an update (fast-forward) if the
-# merge base of $old and $new is $old.
-#
-$op = 'U' if ($op eq 'R'
-	&& $ref =~ m,^heads/,
-	&& $old eq git_value('merge-base',$old,$new));
-
-# Load the user's ACL file. Expand groups (user.memberof) one level.
-{
-	my %data = ('user.committer' => []);
-	parse_config(\%data,$acl_git,$acl_branch,"external/$repository_name.acl");
-
-	%data = (
-		'user.committer' => $data{'user.committer'},
-		'user.memberof' => [],
-	);
-	parse_config(\%data,$acl_git,$acl_branch,"users/$this_user.acl");
-
-	%user_committer = map {$_ => $_} @{$data{'user.committer'}};
-	my $rule_key = "repository.$repository_name.allow";
-	my $rules = $data{$rule_key} || [];
-
-	foreach my $group (@{$data{'user.memberof'}}) {
-		my %g;
-		parse_config(\%g,$acl_git,$acl_branch,"groups/$group.acl");
-		my $group_rules = $g{$rule_key};
-		push @$rules, @$group_rules if $group_rules;
-	}
-
-RULE:
-	foreach (@$rules) {
-		while (/\${user\.([a-z][a-zA-Z0-9]+)}/) {
-			my $k = lc $1;
-			my $v = $data{"user.$k"};
-			next RULE unless defined $v;
-			next RULE if @$v != 1;
-			next RULE unless defined $v->[0];
-			s/\${user\.$k}/$v->[0]/g;
-		}
-
-		if (/^([AMD ]+)\s+of\s+([^\s]+)\s+for\s+([^\s]+)\s+diff\s+([^\s]+)$/) {
-			my ($ops, $pth, $ref, $bst) = ($1, $2, $3, $4);
-			$ops =~ s/ //g;
-			$pth =~ s/\\\\/\\/g;
-			$ref =~ s/\\\\/\\/g;
-			push @path_rules, [$ops, $pth, $ref, $bst];
-		} elsif (/^([AMD ]+)\s+of\s+([^\s]+)\s+for\s+([^\s]+)$/) {
-			my ($ops, $pth, $ref) = ($1, $2, $3);
-			$ops =~ s/ //g;
-			$pth =~ s/\\\\/\\/g;
-			$ref =~ s/\\\\/\\/g;
-			push @path_rules, [$ops, $pth, $ref, $old];
-		} elsif (/^([CDRU ]+)\s+for\s+([^\s]+)$/) {
-			my $ops = $1;
-			my $ref = $2;
-			$ops =~ s/ //g;
-			$ref =~ s/\\\\/\\/g;
-			push @allow_rules, [$ops, $ref];
-		} elsif (/^for\s+([^\s]+)$/) {
-			# Mentioned, but nothing granted?
-		} elsif (/^[^\s]+$/) {
-			s/\\\\/\\/g;
-			push @allow_rules, ['U', $_];
-		}
-	}
-}
-
-if ($op ne 'D') {
-	$new_type = git_value('cat-file','-t',$new);
-
-	if ($ref =~ m,^heads/,) {
-		deny "$ref must be a commit." unless $new_type eq 'commit';
-	} elsif ($ref =~ m,^tags/,) {
-		deny "$ref must be an annotated tag." unless $new_type eq 'tag';
-	}
-
-	check_committers (all_new_committers);
-	check_committers (all_new_taggers) if $new_type eq 'tag';
-}
-
-info "$this_user wants $op for $ref";
-foreach my $acl_entry (@allow_rules) {
-	my ($acl_ops, $acl_n) = @$acl_entry;
-	next unless $acl_ops =~ /^[CDRU]+$/; # Uhh.... shouldn't happen.
-	next unless $acl_n;
-	next unless $op =~ /^[$acl_ops]$/;
-	next unless match_string $acl_n, $ref;
-
-	# Don't test path rules on branch deletes.
-	#
-	grant "Allowed by: $acl_ops for $acl_n" if $op eq 'D';
-
-	# Aggregate matching path rules; allow if there aren't
-	# any matching this ref.
-	#
-	my %pr;
-	foreach my $p_entry (@path_rules) {
-		my ($p_ops, $p_n, $p_ref, $p_bst) = @$p_entry;
-		next unless $p_ref;
-		push @{$pr{$p_bst}}, $p_entry if match_string $p_ref, $ref;
-	}
-	grant "Allowed by: $acl_ops for $acl_n" unless %pr;
-
-	# Allow only if all changes against a single base are
-	# allowed by file path rules.
-	#
-	my @bad;
-	foreach my $p_bst (keys %pr) {
-		my $diff_ref = load_diff $p_bst;
-		deny "Cannot difference trees." unless ref $diff_ref;
-
-		my %fd = %$diff_ref;
-		foreach my $p_entry (@{$pr{$p_bst}}) {
-			my ($p_ops, $p_n, $p_ref, $p_bst) = @$p_entry;
-			next unless $p_ops =~ /^[AMD]+$/;
-			next unless $p_n;
-
-			foreach my $f_n (keys %fd) {
-				my $f_op = $fd{$f_n};
-				next unless $f_op;
-				next unless $f_op =~ /^[$p_ops]$/;
-				delete $fd{$f_n} if match_string $p_n, $f_n;
-			}
-			last unless %fd;
-		}
-
-		if (%fd) {
-			push @bad, [$p_bst, \%fd];
-		} else {
-			# All changes relative to $p_bst were allowed.
-			#
-			grant "Allowed by: $acl_ops for $acl_n diff $p_bst";
-		}
-	}
-
-	foreach my $bad_ref (@bad) {
-		my ($p_bst, $fd) = @$bad_ref;
-		print STDERR "\n";
-		print STDERR "Not allowed to make the following changes:\n";
-		print STDERR "(base: $p_bst)\n";
-		foreach my $f_n (sort keys %$fd) {
-			print STDERR "  $fd->{$f_n} $f_n\n";
-		}
-	}
-	deny "You are not permitted to $op $ref";
-}
-close A;
-deny "You are not permitted to $op $ref";
-- 
1.9.2+fc1.27.gbce2056

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 00/25] contrib: cleanup
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (20 preceding siblings ...)
  2014-05-09  0:58 ` [PATCH v1 24/25] contrib: remove 'hooks' Felipe Contreras
@ 2014-05-09  1:47 ` Martin Langhoff
       [not found] ` <CACPiFCJnsu3qw59oK94sP1u0+KBDvne0ZpKS0LMGc_9ge+rJjA@mail.gmail.com>
                   ` (3 subsequent siblings)
  25 siblings, 0 replies; 83+ messages in thread
From: Martin Langhoff @ 2014-05-09  1:47 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: Git Mailing List, Junio C Hamano

On Thu, May 8, 2014 at 8:58 PM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> Let us be honest, the vast majority of tools in 'contrib/' have no chance of
> ever graduating, so let's remove them.

I am curious -- have you checked what parts of contrib downstreams
package&ship? Are you planning on CC'ing the (inactive)
authors/maintainers so they know that if they care they should host
those elsewhere?

My candid opinion is that you're trying to force a group of people to
undertake a pointless exercise. Contrib in many/most projects is
uneven, and folks know that. But it gives upstream a chance to push
for some minimal quality, and in turn it gives visibility to a bunch
of sometimes useful tools.

If my code was going to get the axe, I'd be rather pissed off. If
Junio is in agreement that code quality is bad, or tools should have
unit tests, then the push could be to address the problem or face
removal. For example: contrib maintainer, show you're responsive to
bug reports on the list, or face removal; add unit tests (or explain
why they aren't needed) or face removal.

cheers,


m
-- 
 martin.langhoff@gmail.com
 -  ask interesting questions
 - don't get distracted with shiny stuff  - working code first
 ~ http://docs.moodle.org/en/User:Martin_Langhoff

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09  0:58 ` [PATCH v1 19/25] contrib: remove 'diff-highlight' Felipe Contreras
@ 2014-05-09  1:51   ` Jeff King
  2014-05-09  1:55     ` Felipe Contreras
  2014-05-09 17:04     ` Junio C Hamano
  0 siblings, 2 replies; 83+ messages in thread
From: Jeff King @ 2014-05-09  1:51 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: git, Junio C Hamano

On Thu, May 08, 2014 at 07:58:30PM -0500, Felipe Contreras wrote:

> No activity since 2012, no tests, no chance of ever graduating.

I don't think "no activity" is an interesting indicator. This tool _is_
actively maintained, but it has not needed any fixes since 2012. I use
it for every single "git log" and "git diff" invocation I do via the
pager.* config.

If we are getting rid of contrib/ I would be happy to continue
maintaining it out-of-tree. But I honestly cannot tell if this thread is
serious or passive-aggressive posturing.

-Peff

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09  1:51   ` Jeff King
@ 2014-05-09  1:55     ` Felipe Contreras
  2014-05-09 13:37       ` Stefan Beller
  2014-05-09 17:04     ` Junio C Hamano
  1 sibling, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  1:55 UTC (permalink / raw)
  To: Jeff King, Felipe Contreras; +Cc: git, Junio C Hamano

Jeff King wrote:
> On Thu, May 08, 2014 at 07:58:30PM -0500, Felipe Contreras wrote:
> 
> > No activity since 2012, no tests, no chance of ever graduating.
> 
> I don't think "no activity" is an interesting indicator. This tool _is_
> actively maintained, but it has not needed any fixes since 2012. I use
> it for every single "git log" and "git diff" invocation I do via the
> pager.* config.

If this tool is important to you, I'd say you should write tests so that
we (the rest of the world) can verify that it still works properly.

If it does, it might have a chance of graduating to the core, so it
should stay.

> If we are getting rid of contrib/ I would be happy to continue
> maintaining it out-of-tree. But I honestly cannot tell if this thread is
> serious or passive-aggressive posturing.

It is serious.

The purpose of the 'contrib/' area is not clear. The statemens coming
from Junio don't match what is on 'contrib/README'. So we have a huge
variance of quality all over 'contrib/'. Some tools in contrib have
higher quality than what is part of the core (e.g. they have tests,
while git-archimport doesn't).

So this is a serious attempt at making sure we remain consistent through
the core and contrib/.

Personally I would like to see everything in contrib/ have *at least*
some tests and documentation. Otherwise we know what's going to happen;
they are going to rot and nobody will care that the tools don't work any
more, or they won't even know what they do and how to use them.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 00/25] contrib: cleanup
       [not found] ` <CACPiFCJnsu3qw59oK94sP1u0+KBDvne0ZpKS0LMGc_9ge+rJjA@mail.gmail.com>
@ 2014-05-09  2:01   ` Felipe Contreras
  2014-05-09 13:15     ` Stefan Beller
  2014-05-09 15:22     ` Jeff King
  0 siblings, 2 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  2:01 UTC (permalink / raw)
  To: Martin Langhoff, Felipe Contreras; +Cc: Git Mailing List, Junio C Hamano

Martin Langhoff wrote:
> On Thu, May 8, 2014 at 8:58 PM, Felipe Contreras <felipe.contreras@gmail.com
> > wrote:
> 
> > Let us be honest, the vast majority of tools in 'contrib/' have no chance
> > of
> > ever graduating, so let's remove them.
> >
> 
> I am curious -- have you checked what parts of contrib downstreams
> package&ship?

I have checked a few, not throughly. From what I can see most of them
just copy everything to /usr/share/git without much consideration to
what is actually there.

The only exception is the shell completions.

> Are you planning on CC'ing the (inactive) authors/maintainers
> so they know that if they care they should host those elsewhere?

They are already Cc'ed.

> My candid opinion is that you're trying to force a group of people to
> undertake a pointless exercise. Contrib in many/most projects is uneven,
> and folks know that. But it gives upstream a chance to push for some
> minimal quality, and in turn it gives visibility to a bunch of sometimes
> useful tools.

Yes, but that's not what our contrib/ is supposed to be. Read
conrib/README.

> If my code was going to get the axe, I'd be rather pissed off. If Junio is
> in agreement that code quality is bad, or tools should have unit tests,
> then the push could be to address the problem or face removal. For example:
> contrib maintainer, show you're responsive to bug reports on the list, or
> face removal; add unit tests (or explain why they aren't needed) or face
> removal.

That's right, and they are Cc'ed so they can respond.  Some tools have
only one commit or two, and in those I didn't even bother Cc'ing anyone.

Moreover, it's not enough that they are actively maintained. Accoding to
Junio they need to show that they can't work properly out-of-tree, and
thus there's a need for them to be in contrib/. Or they are temporarily
in contrib/ so they can become part of the core. That doesn't apply to
the tools I proposed to remove here.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 12/25] contrib: remove 'vim'
  2014-05-09  0:58 ` [PATCH v1 12/25] contrib: remove 'vim' Felipe Contreras
@ 2014-05-09  2:02   ` Jeff King
  2014-05-09  2:23     ` Jonathan Nieder
  0 siblings, 1 reply; 83+ messages in thread
From: Jeff King @ 2014-05-09  2:02 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: git, Junio C Hamano

On Thu, May 08, 2014 at 07:58:23PM -0500, Felipe Contreras wrote:

> There's nothing there.

It's not nothing; we used to carry the tools here, and replaced them
with pointers when the tools themselves went away. That was certainly
useful for a period of time.

However, I would certainly agree that that period of time is probably
over; the scripts started shipping in upstream vim in mid-2008. I'd be
happy to see this directory go away whether or not the rest of contrib/
is dropped.

-Peff

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 07/25] contrib: remove 'git-jump'
  2014-05-09  0:58 ` [PATCH v1 07/25] contrib: remove 'git-jump' Felipe Contreras
@ 2014-05-09  2:03   ` Jeff King
  2014-05-09  2:12     ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: Jeff King @ 2014-05-09  2:03 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: git, Junio C Hamano

On Thu, May 08, 2014 at 07:58:18PM -0500, Felipe Contreras wrote:

> No activity, no tests.

Like diff-highlight, I don't think "no activity" is a useful indicator.
I use this daily, and several people have commented off-list to me that
they use it, too.

Like diff-highlight, I'm happy to maintain it out-of-tree if contrib/ is
going away.

-Peff

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 07/25] contrib: remove 'git-jump'
  2014-05-09  2:03   ` Jeff King
@ 2014-05-09  2:12     ` Felipe Contreras
  2014-05-09 15:20       ` Jeff King
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  2:12 UTC (permalink / raw)
  To: Jeff King, Felipe Contreras; +Cc: git, Junio C Hamano

Jeff King wrote:
> On Thu, May 08, 2014 at 07:58:18PM -0500, Felipe Contreras wrote:
> 
> > No activity, no tests.
> 
> Like diff-highlight, I don't think "no activity" is a useful indicator.
> I use this daily, and several people have commented off-list to me that
> they use it, too.

Add tests then.

It this is never meant to move to the core, then it should go
out-of-tree anyway.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 12/25] contrib: remove 'vim'
  2014-05-09  2:02   ` Jeff King
@ 2014-05-09  2:23     ` Jonathan Nieder
  0 siblings, 0 replies; 83+ messages in thread
From: Jonathan Nieder @ 2014-05-09  2:23 UTC (permalink / raw)
  To: Jeff King; +Cc: Felipe Contreras, git, Junio C Hamano

Hi,

Jeff King wrote:

> However, I would certainly agree that that period of time is probably
> over; the scripts started shipping in upstream vim in mid-2008. I'd be
> happy to see this directory go away whether or not the rest of contrib/
> is dropped.

RHEL 6 has vim 7.2.something, so yeah, this should be mostly safe.

Git needs to keep working for people stuck on RHEL 5, but niceties
like vim support seem less important there.  But I am not convinced it
is worth inconveniencing them (or putting any obstacles in the way of
upgrading) without a good reason, and one less directory in contrib/
does not seem like a very strong reason.

Here's a new commit message in case we want to do this.

-- >8 --
Subject: contrib: remove vim support instructions

The git support scripts started shipping in upstream vim in version
7.2 (2008-08-09).  Clean up contrib/ a little by removing the
instructions for people on older versions of vim.

RHEL 6 already has vim 7.2.something, so anyone on a reasonably modern
operating system should not be affected.  Users on RHEL 5 presumably
know that means sometimes missing out on niceties like syntax
highlighting, so this should be safe.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 contrib/vim/README | 22 ----------------------
 1 file changed, 22 deletions(-)
 delete mode 100644 contrib/vim/README

diff --git a/contrib/vim/README b/contrib/vim/README
deleted file mode 100644
index 8f16d06..0000000
--- a/contrib/vim/README
+++ /dev/null
@@ -1,22 +0,0 @@
-Syntax highlighting for git commit messages, config files, etc. is
-included with the vim distribution as of vim 7.2, and should work
-automatically.
-
-If you have an older version of vim, you can get the latest syntax
-files from the vim project:
-
-  http://ftp.vim.org/pub/vim/runtime/syntax/git.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitcommit.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitconfig.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitrebase.vim
-  http://ftp.vim.org/pub/vim/runtime/syntax/gitsendemail.vim
-
-These files are also available via FTP at the same location.
-
-To install:
-
-  1. Copy these files to vim's syntax directory $HOME/.vim/syntax
-  2. To auto-detect the editing of various git-related filetypes:
-
-	$ curl http://ftp.vim.org/pub/vim/runtime/filetype.vim |
-		sed -ne '/^" Git$/, /^$/ p' >>$HOME/.vim/filetype.vim
-- 
1.9.1.423.g4596e3a

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 02/25] contrib: remove 'hg-to-git'
  2014-05-09  0:58 ` [PATCH v1 02/25] contrib: remove 'hg-to-git' Felipe Contreras
@ 2014-05-09  6:44   ` Miklos Vajna
  0 siblings, 0 replies; 83+ messages in thread
From: Miklos Vajna @ 2014-05-09  6:44 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: git, Junio C Hamano

[-- Attachment #1: Type: text/plain, Size: 326 bytes --]

On Thu, May 08, 2014 at 07:58:13PM -0500, Felipe Contreras <felipe.contreras@gmail.com> wrote:
> There hasn't been any real activity on it since 2010.
> 
> Plus there are better out-of-tree tools.
> 
> No tests and no real documentation either.

ACK, "git clone hg::..." is what one is supposed to use today, I guess.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 198 bytes --]

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  0:58 ` [PATCH v1 04/25] contrib: remove 'buildsystems' Felipe Contreras
@ 2014-05-09  7:53   ` Erik Faye-Lund
  2014-05-09  8:14     ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: Erik Faye-Lund @ 2014-05-09  7:53 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: GIT Mailing-list, Junio C Hamano

On Fri, May 9, 2014 at 2:58 AM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> No activity since 2010, no documentation, no tests.
>
> Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
> ---
>  contrib/buildsystems/Generators.pm        |  42 --
>  contrib/buildsystems/Generators/QMake.pm  | 189 ---------
>  contrib/buildsystems/Generators/Vcproj.pm | 626 ------------------------------
>  contrib/buildsystems/engine.pl            | 359 -----------------
>  contrib/buildsystems/generate             |  29 --
>  contrib/buildsystems/parse.pl             | 228 -----------
>  6 files changed, 1473 deletions(-)
>  delete mode 100644 contrib/buildsystems/Generators.pm
>  delete mode 100644 contrib/buildsystems/Generators/QMake.pm
>  delete mode 100644 contrib/buildsystems/Generators/Vcproj.pm
>  delete mode 100755 contrib/buildsystems/engine.pl
>  delete mode 100755 contrib/buildsystems/generate
>  delete mode 100755 contrib/buildsystems/parse.pl

Please don't. This script is useful to build with the MSVC IDE, which
enables us to use their excellent debugger.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  7:53   ` Erik Faye-Lund
@ 2014-05-09  8:14     ` Felipe Contreras
  2014-05-09  8:33       ` Erik Faye-Lund
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  8:14 UTC (permalink / raw)
  To: Erik Faye-Lund, Felipe Contreras; +Cc: GIT Mailing-list, Junio C Hamano

Erik Faye-Lund wrote:
> On Fri, May 9, 2014 at 2:58 AM, Felipe Contreras
> <felipe.contreras@gmail.com> wrote:
> > No activity since 2010, no documentation, no tests.
> >
> > Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
> > ---
> >  contrib/buildsystems/Generators.pm        |  42 --
> >  contrib/buildsystems/Generators/QMake.pm  | 189 ---------
> >  contrib/buildsystems/Generators/Vcproj.pm | 626 ------------------------------
> >  contrib/buildsystems/engine.pl            | 359 -----------------
> >  contrib/buildsystems/generate             |  29 --
> >  contrib/buildsystems/parse.pl             | 228 -----------
> >  6 files changed, 1473 deletions(-)
> >  delete mode 100644 contrib/buildsystems/Generators.pm
> >  delete mode 100644 contrib/buildsystems/Generators/QMake.pm
> >  delete mode 100644 contrib/buildsystems/Generators/Vcproj.pm
> >  delete mode 100755 contrib/buildsystems/engine.pl
> >  delete mode 100755 contrib/buildsystems/generate
> >  delete mode 100755 contrib/buildsystems/parse.pl
> 
> Please don't. This script is useful to build with the MSVC IDE, which
> enables us to use their excellent debugger.

If you want this script to remain in contrib, please:

 a) Write at least a few tests
 b) Write some documentation
 c) Explain why it cannot live outside the git.git repository like other
    tools. [1][2][3]

Cheers.

[1] https://github.com/visionmedia/git-extras
[2] https://github.com/mislav/git-deploy
[3] https://github.com/git-ftp/git-ftp

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 18/25] contrib: remove 'emacs'
       [not found]   ` <CAFcZeCqbF54-KjHU1R3pC6XgWi21KcpRGB7HcbfSGyvTScQU2A@mail.gmail.com>
@ 2014-05-09  8:29     ` Felipe Contreras
       [not found]       ` <CAFcZeCo5mCfnUN1uBiaZnD6DL6y8hPhK5MPts5raLCTGwJX9Gg@mail.gmail.com>
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  8:29 UTC (permalink / raw)
  To: David Kågedal, Felipe Contreras
  Cc: git, Junio C Hamano, Alexandre Julliard, David Kågedal,
	Jakub Narębski

David Kågedal wrote:
> What problem does this removal solve?

Please do not top post.

  a) What problem does it solve by staying?
  b) Where are the tests?
  c) Why it cannot be moved to an outside repository like may other
     git-related tools?

> 2014-05-09 2:58 GMT+02:00 Felipe Contreras <felipe.contreras@gmail.com>:
> 
> > No activity since 2012, no tests, and no chance of ever graduating.
> >
> > Also, probably better out-of-tree tools out there.
> >
> > Cc: Alexandre Julliard <julliard@winehq.org>
> > Cc: David Kågedal <davidk@lysator.liu.se>
> > Cc: Jakub Narębski <jnareb@gmail.com>
> > Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>

A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing in e-mail?

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  8:14     ` Felipe Contreras
@ 2014-05-09  8:33       ` Erik Faye-Lund
  2014-05-09  8:48         ` Felipe Contreras
  2014-05-09 18:33         ` Jonathan Nieder
  0 siblings, 2 replies; 83+ messages in thread
From: Erik Faye-Lund @ 2014-05-09  8:33 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

On Fri, May 9, 2014 at 10:14 AM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> Erik Faye-Lund wrote:
>> On Fri, May 9, 2014 at 2:58 AM, Felipe Contreras
>> <felipe.contreras@gmail.com> wrote:
>> > No activity since 2010, no documentation, no tests.
>> >
>> > Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
>> > ---
>> >  contrib/buildsystems/Generators.pm        |  42 --
>> >  contrib/buildsystems/Generators/QMake.pm  | 189 ---------
>> >  contrib/buildsystems/Generators/Vcproj.pm | 626 ------------------------------
>> >  contrib/buildsystems/engine.pl            | 359 -----------------
>> >  contrib/buildsystems/generate             |  29 --
>> >  contrib/buildsystems/parse.pl             | 228 -----------
>> >  6 files changed, 1473 deletions(-)
>> >  delete mode 100644 contrib/buildsystems/Generators.pm
>> >  delete mode 100644 contrib/buildsystems/Generators/QMake.pm
>> >  delete mode 100644 contrib/buildsystems/Generators/Vcproj.pm
>> >  delete mode 100755 contrib/buildsystems/engine.pl
>> >  delete mode 100755 contrib/buildsystems/generate
>> >  delete mode 100755 contrib/buildsystems/parse.pl
>>
>> Please don't. This script is useful to build with the MSVC IDE, which
>> enables us to use their excellent debugger.
>
> If you want this script to remain in contrib, please:
>
>  a) Write at least a few tests
>  b) Write some documentation
>  c) Explain why it cannot live outside the git.git repository like other
>     tools. [1][2][3]

(Adding Marius, the original author to the CC-list)

Uh, why is such a burden required all of a sudden? contrib/README
mentions no such requirements, and the scripts have been accepted (and
maintained) since. Besides, you say "No activity since 2010" - this is
not the case, bc380fc is from November 2013. And there's already
*some* documentation in the scripts themselves.

Please stop your pointless crusade that'll only break other people's work-flows.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  8:33       ` Erik Faye-Lund
@ 2014-05-09  8:48         ` Felipe Contreras
  2014-05-09  9:10           ` Erik Faye-Lund
  2014-05-09  9:17           ` David Kastrup
  2014-05-09 18:33         ` Jonathan Nieder
  1 sibling, 2 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  8:48 UTC (permalink / raw)
  To: Erik Faye-Lund, Felipe Contreras
  Cc: GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

Erik Faye-Lund wrote:
> On Fri, May 9, 2014 at 10:14 AM, Felipe Contreras
> <felipe.contreras@gmail.com> wrote:
> > If you want this script to remain in contrib, please:
> >
> >  a) Write at least a few tests
> >  b) Write some documentation
> >  c) Explain why it cannot live outside the git.git repository like other
> >     tools. [1][2][3]
> 
> (Adding Marius, the original author to the CC-list)
> 
> Uh, why is such a burden required all of a sudden? contrib/README
> mentions no such requirements, and the scripts have been accepted (and
> maintained) since.

contrib/README mentions clearly the expectation that these scripts
eventually move to the core once they mature. This is never going to
happen for these.

It also mentions that inactive ones would be proposed for removal, and
this one is clearly inactive. It has 9 commits (if you count the one
that changes the execution bit).

> Besides, you say "No activity since 2010" - this is not the case,
> bc380fc is from November 2013.

You think changing the execution bit of a file is considered "activity"?

> And there's already *some* documentation in the scripts themselves.

That's nice. So you can just copy that into a README.

> Please stop your pointless crusade that'll only break other people's work-flows.

If you care about these scripts, it should be trivial for you to add at
least a few tests, souldn't it?

Please tell me how exactly will your work-flow be broken. More
specifically, tell me why your scripts cannot be moved outside of git,
like git-extras[1], git-deploy[2], git-ftp[3], and countless other
tools.

Cheers.

[1] https://github.com/visionmedia/git-extras
[2] https://github.com/mislav/git-deploy
[3] https://github.com/git-ftp/git-ftp

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 18/25] contrib: remove 'emacs'
       [not found]       ` <CAFcZeCo5mCfnUN1uBiaZnD6DL6y8hPhK5MPts5raLCTGwJX9Gg@mail.gmail.com>
@ 2014-05-09  8:50         ` Felipe Contreras
  2014-05-09 14:50         ` Alexandre Julliard
  1 sibling, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  8:50 UTC (permalink / raw)
  To: David Kågedal, Felipe Contreras
  Cc: git, Junio C Hamano, Alexandre Julliard, David Kågedal,
	Jakub Narębski

David Kågedal wrote:
> 2014-05-09 10:29 GMT+02:00 Felipe Contreras <felipe.contreras@gmail.com>:
> 
> > David Kågedal wrote:
> > > What problem does this removal solve?
> >
> > Please do not top post.
> >
> >   a) What problem does it solve by staying?
> >   b) Where are the tests?
> >   c) Why it cannot be moved to an outside repository like may other
> >      git-related tools?
> 
> Fair enough. I guess the target should rather be to get it into the emacs
> distribution.

That would be ideal I think.

However, I see many tools that already exist in the emacs wiki[1].

Why can't this one be one for those?

Cheers.

[1] http://www.emacswiki.org/emacs/Git

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  8:48         ` Felipe Contreras
@ 2014-05-09  9:10           ` Erik Faye-Lund
  2014-05-09  9:32             ` Felipe Contreras
  2014-05-09  9:17           ` David Kastrup
  1 sibling, 1 reply; 83+ messages in thread
From: Erik Faye-Lund @ 2014-05-09  9:10 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

On Fri, May 9, 2014 at 10:48 AM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> Erik Faye-Lund wrote:
>> On Fri, May 9, 2014 at 10:14 AM, Felipe Contreras
>> <felipe.contreras@gmail.com> wrote:
>> > If you want this script to remain in contrib, please:
>> >
>> >  a) Write at least a few tests
>> >  b) Write some documentation
>> >  c) Explain why it cannot live outside the git.git repository like other
>> >     tools. [1][2][3]
>>
>> (Adding Marius, the original author to the CC-list)
>>
>> Uh, why is such a burden required all of a sudden? contrib/README
>> mentions no such requirements, and the scripts have been accepted (and
>> maintained) since.
>
> contrib/README mentions clearly the expectation that these scripts
> eventually move to the core once they mature. This is never going to
> happen for these.

Yes, *expectation*. Not requirement.

> It also mentions that inactive ones would be proposed for removal, and
> this one is clearly inactive. It has 9 commits (if you count the one
> that changes the execution bit).

It mentions that Junio *might* suggest things to be removed, not that
things *should* be removed if left unmaintained.

And this script is not unmaintained, it's simply just still working.

>> Besides, you say "No activity since 2010" - this is not the case,
>> bc380fc is from November 2013.
>
> You think changing the execution bit of a file is considered "activity"?
>

Well, now we're getting into semantics, which I don't care so much
about. It shows some sort of interest in the scripts, at least.

>> And there's already *some* documentation in the scripts themselves.
>
> That's nice. So you can just copy that into a README.

Feel free to scratch that itch yourself, you're the one inventing new
requirements here.

>> Please stop your pointless crusade that'll only break other people's work-flows.
>
> If you care about these scripts, it should be trivial for you to add at
> least a few tests, souldn't it?

Again, testing this is not my itch. Feel free to scratch that one
yourself, but please don't remove the script.

> Please tell me how exactly will your work-flow be broken. More
> specifically, tell me why your scripts cannot be moved outside of git,
> like git-extras[1], git-deploy[2], git-ftp[3], and countless other
> tools.

Moving the script out of the repo makes it less convenient to bisect
issues with MSVC, as it depends heavily on the top-level Makefile.
Moving it out would require figuring out what version of the script
matches a given git revision, which is a hassle.

Again, please stop this pointless crusade.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  8:48         ` Felipe Contreras
  2014-05-09  9:10           ` Erik Faye-Lund
@ 2014-05-09  9:17           ` David Kastrup
  2014-05-09  9:35             ` Felipe Contreras
  1 sibling, 1 reply; 83+ messages in thread
From: David Kastrup @ 2014-05-09  9:17 UTC (permalink / raw)
  To: Felipe Contreras
  Cc: Erik Faye-Lund, GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

Felipe Contreras <felipe.contreras@gmail.com> writes:

> Erik Faye-Lund wrote:
>> On Fri, May 9, 2014 at 10:14 AM, Felipe Contreras
>> <felipe.contreras@gmail.com> wrote:
>> > If you want this script to remain in contrib, please:
>> >
>> >  a) Write at least a few tests
>> >  b) Write some documentation
>> >  c) Explain why it cannot live outside the git.git repository like other
>> >     tools. [1][2][3]
>> 
>> (Adding Marius, the original author to the CC-list)
>> 
>> Uh, why is such a burden required all of a sudden? contrib/README
>> mentions no such requirements, and the scripts have been accepted (and
>> maintained) since.
>
> contrib/README mentions clearly the expectation that these scripts
> eventually move to the core once they mature. This is never going to
> happen for these.
>
> It also mentions that inactive ones would be proposed for removal, and
> this one is clearly inactive. It has 9 commits (if you count the one
> that changes the execution bit).
>
>> Besides, you say "No activity since 2010" - this is not the case,
>> bc380fc is from November 2013.
>
> You think changing the execution bit of a file is considered "activity"?

For an indication of "this software has actual users", it definitely
would count as such, yes.  Why would someone change the executable bit
if it did not impact his usage of the software?

The idea of removing software from distribution is to get rid of stuff
without a user base rather than punishing lazy developers.

If it were the latter, then you could argue that anybody not willing to
host his own repository should get thrown off Git's.  That would solve
the whole contrib "problem" in one fell swoop.

-- 
David Kastrup

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  9:10           ` Erik Faye-Lund
@ 2014-05-09  9:32             ` Felipe Contreras
  2014-05-09 10:02               ` Erik Faye-Lund
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  9:32 UTC (permalink / raw)
  To: Erik Faye-Lund, Felipe Contreras
  Cc: GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

Erik Faye-Lund wrote:
> On Fri, May 9, 2014 at 10:48 AM, Felipe Contreras
> <felipe.contreras@gmail.com> wrote:
> > Erik Faye-Lund wrote:
> >> On Fri, May 9, 2014 at 10:14 AM, Felipe Contreras
> >> <felipe.contreras@gmail.com> wrote:
> >> > If you want this script to remain in contrib, please:
> >> >
> >> >  a) Write at least a few tests
> >> >  b) Write some documentation
> >> >  c) Explain why it cannot live outside the git.git repository like other
> >> >     tools. [1][2][3]
> >>
> >> (Adding Marius, the original author to the CC-list)
> >>
> >> Uh, why is such a burden required all of a sudden? contrib/README
> >> mentions no such requirements, and the scripts have been accepted (and
> >> maintained) since.
> >
> > contrib/README mentions clearly the expectation that these scripts
> > eventually move to the core once they mature. This is never going to
> > happen for these.
> 
> Yes, *expectation*. Not requirement.

That's right, but these tools fail all expectations.

> > It also mentions that inactive ones would be proposed for removal, and
> > this one is clearly inactive. It has 9 commits (if you count the one
> > that changes the execution bit).
> 
> It mentions that Junio *might* suggest things to be removed, not that
> things *should* be removed if left unmaintained.

That's right.

> And this script is not unmaintained, it's simply just still working.

Prove it.

Either way, if there was people actively caring about these scripts,
there should be cleanups, tests, documentation. But there's nothing.

> >> Besides, you say "No activity since 2010" - this is not the case,
> >> bc380fc is from November 2013.
> >
> > You think changing the execution bit of a file is considered "activity"?
> 
> Well, now we're getting into semantics, which I don't care so much
> about.

Convenient.

> It shows some sort of interest in the scripts, at least.

Not it doesn't. Jonathan Nieder updated the execution bit on a bunch of
scripts in contrib, these being just in the way. It doesn't show
interest at all.

> >> And there's already *some* documentation in the scripts themselves.
> >
> > That's nice. So you can just copy that into a README.
> 
> Feel free to scratch that itch yourself, you're the one inventing new
> requirements here.

If you care about these scripts, you have an interesting way of showing
it.

> >> Please stop your pointless crusade that'll only break other people's work-flows.
> >
> > If you care about these scripts, it should be trivial for you to add at
> > least a few tests, souldn't it?
> 
> Again, testing this is not my itch. Feel free to scratch that one
> yourself, but please don't remove the script.

If you don't care that these scripts keep working properly, I don't see
why anybody else would.
 
> > Please tell me how exactly will your work-flow be broken. More
> > specifically, tell me why your scripts cannot be moved outside of git,
> > like git-extras[1], git-deploy[2], git-ftp[3], and countless other
> > tools.
> 
> Moving the script out of the repo makes it less convenient to bisect
> issues with MSVC, as it depends heavily on the top-level Makefile.
> Moving it out would require figuring out what version of the script
> matches a given git revision, which is a hassle.

The script doesn't depend on the version of the Makefile, and proof of
that is that is has *never* been changed even though the Makefile has.

If you do:

 % cd ~/git
 % ./contrib/buildsystems/generate

You can do:

 % cd ~/git
 % ~/buildsystems/generate

And the result would be *exactly* the same.

That is not a reason.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  9:17           ` David Kastrup
@ 2014-05-09  9:35             ` Felipe Contreras
  2014-05-09  9:44               ` David Kastrup
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09  9:35 UTC (permalink / raw)
  To: David Kastrup, Felipe Contreras
  Cc: Erik Faye-Lund, GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

David Kastrup wrote:
> Felipe Contreras <felipe.contreras@gmail.com> writes:
> >> Besides, you say "No activity since 2010" - this is not the case,
> >> bc380fc is from November 2013.
> >
> > You think changing the execution bit of a file is considered "activity"?
> 
> For an indication of "this software has actual users", it definitely
> would count as such, yes.  Why would someone change the executable bit
> if it did not impact his usage of the software?

Because that somebody spotted this while changing the executable bit of
other scripts, which is precisely what happened (or at least seems so
from the history).

> The idea of removing software from distribution is to get rid of stuff
> without a user base rather than punishing lazy developers.

No. There's tons of Git tools out there. Should we include them all in
contrib/?

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  9:35             ` Felipe Contreras
@ 2014-05-09  9:44               ` David Kastrup
  2014-05-09 10:50                 ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: David Kastrup @ 2014-05-09  9:44 UTC (permalink / raw)
  To: Felipe Contreras
  Cc: Erik Faye-Lund, GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

Felipe Contreras <felipe.contreras@gmail.com> writes:

> David Kastrup wrote:
>
>> The idea of removing software from distribution is to get rid of
>> stuff without a user base rather than punishing lazy developers.
>
> No.

So we have you on record that you would want to get rid of stuff _with_
a user base and/or to punish lazy developers.

That's not inconsistent with your other replies, but you probably did
not express it as bluntly elsewhere.

-- 
David Kastrup

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  9:32             ` Felipe Contreras
@ 2014-05-09 10:02               ` Erik Faye-Lund
  2014-05-09 10:57                 ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: Erik Faye-Lund @ 2014-05-09 10:02 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

On Fri, May 9, 2014 at 11:32 AM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> Erik Faye-Lund wrote:
>> On Fri, May 9, 2014 at 10:48 AM, Felipe Contreras
>> <felipe.contreras@gmail.com> wrote:
>> > Erik Faye-Lund wrote:
>> >> On Fri, May 9, 2014 at 10:14 AM, Felipe Contreras
>> >> <felipe.contreras@gmail.com> wrote:
>> >> > If you want this script to remain in contrib, please:
>> >> >
>> >> >  a) Write at least a few tests
>> >> >  b) Write some documentation
>> >> >  c) Explain why it cannot live outside the git.git repository like other
>> >> >     tools. [1][2][3]
>> >>
>> >> (Adding Marius, the original author to the CC-list)
>> >>
>> >> Uh, why is such a burden required all of a sudden? contrib/README
>> >> mentions no such requirements, and the scripts have been accepted (and
>> >> maintained) since.
>> >
>> > contrib/README mentions clearly the expectation that these scripts
>> > eventually move to the core once they mature. This is never going to
>> > happen for these.
>>
>> Yes, *expectation*. Not requirement.
>
> That's right, but these tools fail all expectations.
>
>> > It also mentions that inactive ones would be proposed for removal, and
>> > this one is clearly inactive. It has 9 commits (if you count the one
>> > that changes the execution bit).
>>
>> It mentions that Junio *might* suggest things to be removed, not that
>> things *should* be removed if left unmaintained.
>
> That's right.
>
>> And this script is not unmaintained, it's simply just still working.
>
> Prove it.
>
> Either way, if there was people actively caring about these scripts,
> there should be cleanups, tests, documentation. But there's nothing.
>
>> >> Besides, you say "No activity since 2010" - this is not the case,
>> >> bc380fc is from November 2013.
>> >
>> > You think changing the execution bit of a file is considered "activity"?
>>
>> Well, now we're getting into semantics, which I don't care so much
>> about.
>
> Convenient.
>

Yeah, the part above here goes in my "don't argue with idiots, they'll
drag you down to their level and beat you with experience"-filter.
Good luck trying to convince *anyone* with this line of argumentation.

>> It shows some sort of interest in the scripts, at least.
>
> Not it doesn't. Jonathan Nieder updated the execution bit on a bunch of
> scripts in contrib, these being just in the way. It doesn't show
> interest at all.
>

All of those changes relate to the MSVC-build. So it's not "just some
batch-fixup" as you're trying to suggest.

>> >> And there's already *some* documentation in the scripts themselves.
>> >
>> > That's nice. So you can just copy that into a README.
>>
>> Feel free to scratch that itch yourself, you're the one inventing new
>> requirements here.
>
> If you care about these scripts, you have an interesting way of showing
> it.
>
>> >> Please stop your pointless crusade that'll only break other people's work-flows.
>> >
>> > If you care about these scripts, it should be trivial for you to add at
>> > least a few tests, souldn't it?
>>
>> Again, testing this is not my itch. Feel free to scratch that one
>> yourself, but please don't remove the script.
>
> If you don't care that these scripts keep working properly, I don't see
> why anybody else would.
>

You're the one making up requirements for tests here, so this is your
itch. This script gets fixed by it's stake-holders when it breaks, and
that has worked out fine so far.

>> > Please tell me how exactly will your work-flow be broken. More
>> > specifically, tell me why your scripts cannot be moved outside of git,
>> > like git-extras[1], git-deploy[2], git-ftp[3], and countless other
>> > tools.
>>
>> Moving the script out of the repo makes it less convenient to bisect
>> issues with MSVC, as it depends heavily on the top-level Makefile.
>> Moving it out would require figuring out what version of the script
>> matches a given git revision, which is a hassle.
>
> The script doesn't depend on the version of the Makefile, and proof of
> that is that is has *never* been changed even though the Makefile has.

Except it has, in 74cf9bd.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 25/25] contrib: remove 'mw-to-git'
       [not found] ` <1399597116-1851-26-git-send-email-felipe.contreras@gmail.com>
@ 2014-05-09 10:46   ` Matthieu Moy
  2014-05-09 10:59     ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: Matthieu Moy @ 2014-05-09 10:46 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: git, Junio C Hamano, Célestin Matte, Benoit Person

Felipe Contreras <felipe.contreras@gmail.com> writes:

> No chance of ever graduating.

I see no relationship between the chance of graduating and the removal
from contrib/.

If you want to remove mw-to-git from contrib, then a good starting point
would be to explain why you want to do so in the commit message.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  9:44               ` David Kastrup
@ 2014-05-09 10:50                 ` Felipe Contreras
  2014-05-09 11:21                   ` David Kastrup
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 10:50 UTC (permalink / raw)
  To: David Kastrup, Felipe Contreras
  Cc: Erik Faye-Lund, GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

David Kastrup wrote:
> Felipe Contreras <felipe.contreras@gmail.com> writes:
> 
> > David Kastrup wrote:
> >
> >> The idea of removing software from distribution is to get rid of
> >> stuff without a user base rather than punishing lazy developers.
> >
> > No.
> 
> So we have you on record that you would want to get rid of stuff
> _with_ a user base

That's what Junio wants.

> and/or to punish lazy developers.

No, that has nothing to do with it.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09 10:02               ` Erik Faye-Lund
@ 2014-05-09 10:57                 ` Felipe Contreras
  2014-05-09 11:35                   ` Erik Faye-Lund
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 10:57 UTC (permalink / raw)
  To: Erik Faye-Lund, Felipe Contreras
  Cc: GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

Erik Faye-Lund wrote:
> On Fri, May 9, 2014 at 11:32 AM, Felipe Contreras
> <felipe.contreras@gmail.com> wrote:
> > Erik Faye-Lund wrote:
> >> On Fri, May 9, 2014 at 10:48 AM, Felipe Contreras
> >> > You think changing the execution bit of a file is considered "activity"?
> >>
> >> Well, now we're getting into semantics, which I don't care so much
> >> about.
> >
> > Convenient.
> 
> Yeah, the part above here goes in my "don't argue with idiots, they'll
> drag you down to their level and beat you with experience"-filter.
> Good luck trying to convince *anyone* with this line of argumentation.

It has been demonstrated that there is inactivity. The fact that your
semantics about "inactivity" differ from the rest of the world is
irrelevant.

> >> It shows some sort of interest in the scripts, at least.
> >
> > Not it doesn't. Jonathan Nieder updated the execution bit on a bunch of
> > scripts in contrib, these being just in the way. It doesn't show
> > interest at all.
> >
> 
> All of those changes relate to the MSVC-build. So it's not "just some
> batch-fixup" as you're trying to suggest.

It is a huge batch-fixup[1]. In fact he mentioned he tested it on
Debian, not Windows.

> > If you don't care that these scripts keep working properly, I don't see
> > why anybody else would.
> 
> You're the one making up requirements for tests here, so this is your
> itch. This script gets fixed by it's stake-holders when it breaks, and
> that has worked out fine so far.

You are not interested in improving the quality of these scripts. Got
it.

> > The script doesn't depend on the version of the Makefile, and proof of
> > that is that is has *never* been changed even though the Makefile has.
> 
> Except it has, in 74cf9bd.

Once change in *four* years. My god! How are people ever going to keep
up with such amount of changes if it moves out-of-tree!

[1] http://article.gmane.org/gmane.comp.version-control.git/238347

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 25/25] contrib: remove 'mw-to-git'
  2014-05-09 10:46   ` [PATCH v1 25/25] contrib: remove 'mw-to-git' Matthieu Moy
@ 2014-05-09 10:59     ` Felipe Contreras
  2014-05-09 12:30       ` Stefan Beller
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 10:59 UTC (permalink / raw)
  To: Matthieu Moy, Felipe Contreras
  Cc: git, Junio C Hamano, Célestin Matte, Benoit Person

Matthieu Moy wrote:
> Felipe Contreras <felipe.contreras@gmail.com> writes:
> 
> > No chance of ever graduating.
> 
> I see no relationship between the chance of graduating and the removal
> from contrib/.

Read contrib/README.

> If you want to remove mw-to-git from contrib, then a good starting point
> would be to explain why you want to do so in the commit message.

The purpose of the contrib area is to either a) give visibility to
otherwise potentially ignored scripts b) serve a staging area for
features before moving into the core.

This script doesn't match either of those. It doesn't belong in the
contrib/ area.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09 10:50                 ` Felipe Contreras
@ 2014-05-09 11:21                   ` David Kastrup
  0 siblings, 0 replies; 83+ messages in thread
From: David Kastrup @ 2014-05-09 11:21 UTC (permalink / raw)
  To: Felipe Contreras
  Cc: Erik Faye-Lund, GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

Felipe Contreras <felipe.contreras@gmail.com> writes:

> David Kastrup wrote:
>> Felipe Contreras <felipe.contreras@gmail.com> writes:
>> 
>> > David Kastrup wrote:
>> >
>> >> The idea of removing software from distribution is to get rid of
>> >> stuff without a user base rather than punishing lazy developers.
>> >
>> > No.
>> 
>> So we have you on record that you would want to get rid of stuff
>> _with_ a user base
>
> That's what Junio wants.

Let's hear it from himself.  Your track record summarizing other
people's opinions to their satisfaction would suggest that he might have
something to add to that.

-- 
David Kastrup

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09 10:57                 ` Felipe Contreras
@ 2014-05-09 11:35                   ` Erik Faye-Lund
  0 siblings, 0 replies; 83+ messages in thread
From: Erik Faye-Lund @ 2014-05-09 11:35 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

On Fri, May 9, 2014 at 12:57 PM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> Erik Faye-Lund wrote:
>> On Fri, May 9, 2014 at 11:32 AM, Felipe Contreras
>> <felipe.contreras@gmail.com> wrote:
>> > Erik Faye-Lund wrote:
>> >> On Fri, May 9, 2014 at 10:48 AM, Felipe Contreras
>> >> > You think changing the execution bit of a file is considered "activity"?
>> >>
>> >> Well, now we're getting into semantics, which I don't care so much
>> >> about.
>> >
>> > Convenient.
>>
>> Yeah, the part above here goes in my "don't argue with idiots, they'll
>> drag you down to their level and beat you with experience"-filter.
>> Good luck trying to convince *anyone* with this line of argumentation.
>
> It has been demonstrated that there is inactivity. The fact that your
> semantics about "inactivity" differ from the rest of the world is
> irrelevant.
>
>> > The script doesn't depend on the version of the Makefile, and proof of
>> > that is that is has *never* been changed even though the Makefile has.
>>
>> Except it has, in 74cf9bd.
>
> Once change in *four* years. My god! How are people ever going to keep
> up with such amount of changes if it moves out-of-tree!
>

It's rather amusing to see you react to my definition of "activity",
when you seem to have a rather unusual definition of "never"...

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 25/25] contrib: remove 'mw-to-git'
  2014-05-09 10:59     ` Felipe Contreras
@ 2014-05-09 12:30       ` Stefan Beller
  0 siblings, 0 replies; 83+ messages in thread
From: Stefan Beller @ 2014-05-09 12:30 UTC (permalink / raw)
  To: Felipe Contreras, Matthieu Moy
  Cc: git, Junio C Hamano, Célestin Matte, Benoit Person

On 09.05.2014 12:59, Felipe Contreras wrote:
> Matthieu Moy wrote:
>> Felipe Contreras <felipe.contreras@gmail.com> writes:
>>
>>> No chance of ever graduating.
>>
>> I see no relationship between the chance of graduating and the removal
>> from contrib/.
> 
> Read contrib/README.
> 
>> If you want to remove mw-to-git from contrib, then a good starting point
>> would be to explain why you want to do so in the commit message.
> 
> The purpose of the contrib area is to either a) give visibility to
> otherwise potentially ignored scripts b) serve a staging area for
> features before moving into the core.
> 
> This script doesn't match either of those. It doesn't belong in the
> contrib/ area.
> 

Maybe we could split it a little bit. Similar to the kernel there is a
staging area. Ok there are some features, which are not yet promoted
to mainline, some never will.

But some things like examples/ could be moved out to another directory.
(How about Documentation/historicEncounters/ ?)

Also we could think about renaming contrib to staging then.
However I don't think it's urgent.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 00/25] contrib: cleanup
  2014-05-09  2:01   ` Felipe Contreras
@ 2014-05-09 13:15     ` Stefan Beller
  2014-05-09 15:22     ` Jeff King
  1 sibling, 0 replies; 83+ messages in thread
From: Stefan Beller @ 2014-05-09 13:15 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: Martin Langhoff, Git Mailing List, Junio C Hamano

For discussing these larger changes in the first version you may want to use
the -D option of git format-patch?

2014-05-09 4:01 GMT+02:00 Felipe Contreras <felipe.contreras@gmail.com>:
> Martin Langhoff wrote:
>> On Thu, May 8, 2014 at 8:58 PM, Felipe Contreras <felipe.contreras@gmail.com
>> > wrote:
>>
>> > Let us be honest, the vast majority of tools in 'contrib/' have no chance
>> > of
>> > ever graduating, so let's remove them.
>> >
>>
>> I am curious -- have you checked what parts of contrib downstreams
>> package&ship?
>
> I have checked a few, not throughly. From what I can see most of them
> just copy everything to /usr/share/git without much consideration to
> what is actually there.
>
> The only exception is the shell completions.
>
>> Are you planning on CC'ing the (inactive) authors/maintainers
>> so they know that if they care they should host those elsewhere?
>
> They are already Cc'ed.
>
>> My candid opinion is that you're trying to force a group of people to
>> undertake a pointless exercise. Contrib in many/most projects is uneven,
>> and folks know that. But it gives upstream a chance to push for some
>> minimal quality, and in turn it gives visibility to a bunch of sometimes
>> useful tools.
>
> Yes, but that's not what our contrib/ is supposed to be. Read
> conrib/README.
>
>> If my code was going to get the axe, I'd be rather pissed off. If Junio is
>> in agreement that code quality is bad, or tools should have unit tests,
>> then the push could be to address the problem or face removal. For example:
>> contrib maintainer, show you're responsive to bug reports on the list, or
>> face removal; add unit tests (or explain why they aren't needed) or face
>> removal.
>
> That's right, and they are Cc'ed so they can respond.  Some tools have
> only one commit or two, and in those I didn't even bother Cc'ing anyone.
>
> Moreover, it's not enough that they are actively maintained. Accoding to
> Junio they need to show that they can't work properly out-of-tree, and
> thus there's a need for them to be in contrib/. Or they are temporarily
> in contrib/ so they can become part of the core. That doesn't apply to
> the tools I proposed to remove here.
>
> --
> Felipe Contreras
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09  1:55     ` Felipe Contreras
@ 2014-05-09 13:37       ` Stefan Beller
  2014-05-09 14:16         ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: Stefan Beller @ 2014-05-09 13:37 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: Jeff King, Git Mailing List, Junio C Hamano

>
> It is serious.
>
> The purpose of the 'contrib/' area is not clear. The statemens coming
> from Junio don't match what is on 'contrib/README'. So we have a huge
> variance of quality all over 'contrib/'. Some tools in contrib have
> higher quality than what is part of the core (e.g. they have tests,
> while git-archimport doesn't).

How about rewriting the README then?
Also as I said in another mail, we could split up the contrib/ area
into multiple areas with narrow defined use-cases, i.e. staging/,
Documentation/historicTools (the current contrib/examples section),
3rdPartyTools/, Bridges/ (for cooperating with other VCS).


>
> So this is a serious attempt at making sure we remain consistent through
> the core and contrib/.
>
> Personally I would like to see everything in contrib/ have *at least*
> some tests and documentation. Otherwise we know what's going to happen;
> they are going to rot and nobody will care that the tools don't work any
> more, or they won't even know what they do and how to use them.
>

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09 13:37       ` Stefan Beller
@ 2014-05-09 14:16         ` Felipe Contreras
  0 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 14:16 UTC (permalink / raw)
  To: Stefan Beller, Felipe Contreras
  Cc: Jeff King, Git Mailing List, Junio C Hamano

Stefan Beller wrote:
> >
> > It is serious.
> >
> > The purpose of the 'contrib/' area is not clear. The statemens coming
> > from Junio don't match what is on 'contrib/README'. So we have a huge
> > variance of quality all over 'contrib/'. Some tools in contrib have
> > higher quality than what is part of the core (e.g. they have tests,
> > while git-archimport doesn't).
> 
> How about rewriting the README then?

To say what?

> Also as I said in another mail, we could split up the contrib/ area
> into multiple areas with narrow defined use-cases, i.e. staging/,
> Documentation/historicTools (the current contrib/examples section),
> 3rdPartyTools/, Bridges/ (for cooperating with other VCS).

That won't fix the issue that these tools are not maintained. A separate
repository 'git-cruft' might do.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 18/25] contrib: remove 'emacs'
       [not found]       ` <CAFcZeCo5mCfnUN1uBiaZnD6DL6y8hPhK5MPts5raLCTGwJX9Gg@mail.gmail.com>
  2014-05-09  8:50         ` Felipe Contreras
@ 2014-05-09 14:50         ` Alexandre Julliard
  2014-05-09 14:53           ` Felipe Contreras
  1 sibling, 1 reply; 83+ messages in thread
From: Alexandre Julliard @ 2014-05-09 14:50 UTC (permalink / raw)
  To: David Kågedal
  Cc: Felipe Contreras, git, Junio C Hamano, Jakub Narębski

David Kågedal <davidk@lysator.liu.se> writes:

> 2014-05-09 10:29 GMT+02:00 Felipe Contreras
> <felipe.contreras@gmail.com>:
>
>     David Kågedal wrote:
>     > What problem does this removal solve?
>     
>     
>     Please do not top post.
>     
>     a) What problem does it solve by staying?
>     b) Where are the tests?
>     c) Why it cannot be moved to an outside repository like may other
>     git-related tools?
>
> Fair enough. I guess the target should rather be to get it into the
> emacs distribution.

It's already in Emacs in a different form, as part of the generic VC
support. And nowadays, users are probably better served by using
something like Magit anyway. As far as my code is concerned I have no
objections to removing it.

-- 
Alexandre Julliard
julliard@winehq.org

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 18/25] contrib: remove 'emacs'
  2014-05-09 14:50         ` Alexandre Julliard
@ 2014-05-09 14:53           ` Felipe Contreras
  0 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 14:53 UTC (permalink / raw)
  To: Alexandre Julliard, David Kågedal
  Cc: Felipe Contreras, git, Junio C Hamano, Jakub Narębski

Alexandre Julliard wrote:
> David Kågedal <davidk@lysator.liu.se> writes:
> 
> > 2014-05-09 10:29 GMT+02:00 Felipe Contreras
> > <felipe.contreras@gmail.com>:
> >
> >     David Kågedal wrote:
> >     > What problem does this removal solve?
> >     
> >     
> >     Please do not top post.
> >     
> >     a) What problem does it solve by staying?
> >     b) Where are the tests?
> >     c) Why it cannot be moved to an outside repository like may other
> >     git-related tools?
> >
> > Fair enough. I guess the target should rather be to get it into the
> > emacs distribution.
> 
> It's already in Emacs in a different form, as part of the generic VC
> support. And nowadays, users are probably better served by using
> something like Magit anyway. As far as my code is concerned I have no
> objections to removing it.

All right. Thanks for the clarification.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 23/25] contrib: remove 'hooks/multimail'
       [not found] ` <1399597116-1851-24-git-send-email-felipe.contreras@gmail.com>
@ 2014-05-09 15:00   ` Michael Haggerty
  2014-05-09 15:04     ` David Kastrup
  2014-05-09 15:18     ` Felipe Contreras
  0 siblings, 2 replies; 83+ messages in thread
From: Michael Haggerty @ 2014-05-09 15:00 UTC (permalink / raw)
  To: Felipe Contreras, git; +Cc: Junio C Hamano

On 05/09/2014 02:58 AM, Felipe Contreras wrote:
> No tests. No chance of ever graduating.
> 
> Already out-of-tree.
> 
> Cc: Michael Haggerty <mhagger@alum.mit.edu>
> Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>

Thank you for your input.

git-multimail is maintained outside of the Git project and is only
distributed along with Git as a convenience to Git users.  It does in
fact have a test suite, along with some other bits and bobs that are not
needed to use it, in the upstream repository at

    https://github.com/mhagger/git-multimail

What's more, it has a maintainer who doesn't routinely insult other
people on the mailing list, conduct endless and pointless flame wars,
think that he is superior to everybody in sight, and throw temper
tantrums when his rudeness, argumentativeness, and arrogance for some
reason don't win the hearts and minds of other contributors.

Cheers,
Michael

-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 23/25] contrib: remove 'hooks/multimail'
  2014-05-09 15:00   ` [PATCH v1 23/25] contrib: remove 'hooks/multimail' Michael Haggerty
@ 2014-05-09 15:04     ` David Kastrup
  2014-05-09 15:28       ` Michael Haggerty
  2014-05-09 15:18     ` Felipe Contreras
  1 sibling, 1 reply; 83+ messages in thread
From: David Kastrup @ 2014-05-09 15:04 UTC (permalink / raw)
  To: Michael Haggerty; +Cc: Felipe Contreras, git, Junio C Hamano

Michael Haggerty <mhagger@alum.mit.edu> writes:

> On 05/09/2014 02:58 AM, Felipe Contreras wrote:
>> No tests. No chance of ever graduating.
>> 
>> Already out-of-tree.
>> 
>> Cc: Michael Haggerty <mhagger@alum.mit.edu>
>> Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
>
> Thank you for your input.
>
> git-multimail is maintained outside of the Git project and is only
> distributed along with Git as a convenience to Git users.  It does in
> fact have a test suite, along with some other bits and bobs that are not
> needed to use it, in the upstream repository at
>
>     https://github.com/mhagger/git-multimail
>
> What's more, it has a maintainer who doesn't routinely insult other
> people on the mailing list, conduct endless and pointless flame wars,
> think that he is superior to everybody in sight, and throw temper
> tantrums when his rudeness, argumentativeness, and arrogance for some
> reason don't win the hearts and minds of other contributors.

Oh come on.  Junio is not _that_ bad.

-- 
David Kastrup

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 06/25] contrib: remove 'diffall'
  2014-05-09  0:58 ` [PATCH v1 06/25] contrib: remove 'diffall' Felipe Contreras
@ 2014-05-09 15:12   ` Tim Henigan
  2014-05-09 18:50     ` Jonathan Nieder
       [not found]   ` <CAFouetj=30Wd_CDiXA0UqqKNdfJSv+C5mWbMJPOkEdqxr7k54w@mail.gmail.com>
  1 sibling, 1 reply; 83+ messages in thread
From: Tim Henigan @ 2014-05-09 15:12 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: Git Mailing List, Junio C Hamano

On Thu, May 8, 2014 at 5:58 PM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> No activity since 2010, no tests.
>
> Cc: Tim Henigan <tim.henigan@gmail.com>
> Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
> ---
>  contrib/diffall/README      |  31 ------
>  contrib/diffall/git-diffall | 257 --------------------------------------------
>  2 files changed, 288 deletions(-)
>  delete mode 100644 contrib/diffall/README
>  delete mode 100755 contrib/diffall/git-diffall

I see no problem with removing this script from contrib.  However, the
commit message
should mention that git-difftool learned all the features of
git-diffall when the '--dir-diff'
option was added in v1.7.11 (ca. June 2012).

Also, the script was first added to contrib in Feb. 2012, so "no
activity since 2010" is
incorrect.  I'm not sure this information is useful in the commit
message at all.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 23/25] contrib: remove 'hooks/multimail'
  2014-05-09 15:00   ` [PATCH v1 23/25] contrib: remove 'hooks/multimail' Michael Haggerty
  2014-05-09 15:04     ` David Kastrup
@ 2014-05-09 15:18     ` Felipe Contreras
  2014-05-09 16:46       ` James Denholm
  1 sibling, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 15:18 UTC (permalink / raw)
  To: Michael Haggerty, Felipe Contreras, git; +Cc: Junio C Hamano

Michael Haggerty wrote:
> On 05/09/2014 02:58 AM, Felipe Contreras wrote:
> > No tests. No chance of ever graduating.
> > 
> > Already out-of-tree.
> > 
> > Cc: Michael Haggerty <mhagger@alum.mit.edu>
> > Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
> 
> Thank you for your input.
> 
> git-multimail is maintained outside of the Git project and is only
> distributed along with Git as a convenience to Git users.

I do not see anywhere in contrib/README any hint that contrib is meant
for that.

> It does in fact have a test suite, along with some other bits and bobs
> that are not needed to use it, in the upstream repository at
> 
>     https://github.com/mhagger/git-multimail

Good to know. But IMO the tests should be in git.git as well, or nothing
at all.

> What's more, it has a maintainer who doesn't routinely insult other
> people on the mailing list,

Aaand skiping the rest. Good bye.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 07/25] contrib: remove 'git-jump'
  2014-05-09  2:12     ` Felipe Contreras
@ 2014-05-09 15:20       ` Jeff King
  2014-05-09 16:13         ` Felipe Contreras
  2014-05-09 17:37         ` Junio C Hamano
  0 siblings, 2 replies; 83+ messages in thread
From: Jeff King @ 2014-05-09 15:20 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: git, Junio C Hamano

On Thu, May 08, 2014 at 09:12:36PM -0500, Felipe Contreras wrote:

> Jeff King wrote:
> > On Thu, May 08, 2014 at 07:58:18PM -0500, Felipe Contreras wrote:
> > 
> > > No activity, no tests.
> > 
> > Like diff-highlight, I don't think "no activity" is a useful indicator.
> > I use this daily, and several people have commented off-list to me that
> > they use it, too.
> 
> Add tests then.

I don't really feel like spending time on it right now. There are better
uses of my time.

I thought on this for a while before responding. Am I simply being lazy
and a bad programmer not to write tests? Am I propagating a double
standard where I do not have to write tests?

Here's the conclusion I came to. Sure, some tests are better than no
tests. But the code works, empirically; I use it every day. It is not
changing, so the chances of regression are low. I can spend an hour
writing tests that demonstrate what I already know. I can even spend
several hours trying to come up with torture cases that might
demonstrate a potential failure that nobody in the real world
experiences. But why?

Because YOU, who have no interest whatsoever in either this script or
diff-highlight, have decided to demand that I write them, or spend time
spinning the code into its own repository. Sorry, but I have more useful
things to do than appease you.

I have no problem with cleaning up cruft in contrib that is broken and
nobody uses; it is a potential hazard and time-waster for people who
look in that directory. But when people say "no, this is maintained, I
use it, and it works", I really don't see the point in you arguing with
them. Nobody benefits.

> It this is never meant to move to the core, then it should go
> out-of-tree anyway.

"should" in your opinion. I know, I know, you will quote contrib/README
at me.  If Junio wants to enforce "contrib is only for things which are
meant to graduate" in his tree, then I will abide by that and maintain
these scripts out-of-tree. But I would rather see an actual decision
from the maintainer on that, and not an 8-year-old README which clearly
has not been followed in the intervening years.

And speaking of wasted time, I do not plan on responding further to you
in this thread. I am telling you ahead of time that this is the case,
because elsewhere[1] I saw you complaining that Junio did not respond to
your emails, which you seemed to think was because he cannot admit that
he was wrong. So I want to say up front that I am going to avoid
interacting with you further because it generally seems fruitless,
consumes a large amount of time, and causes me a great deal of stress.

-Peff

[1] http://article.gmane.org/gmane.comp.version-control.git/248441

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 06/25] contrib: remove 'diffall'
       [not found]   ` <CAFouetj=30Wd_CDiXA0UqqKNdfJSv+C5mWbMJPOkEdqxr7k54w@mail.gmail.com>
@ 2014-05-09 15:20     ` Felipe Contreras
  0 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 15:20 UTC (permalink / raw)
  To: Tim Henigan, Felipe Contreras; +Cc: Git Mailing List, Junio C Hamano

Tim Henigan wrote:
> On Thu, May 8, 2014 at 5:58 PM, Felipe Contreras <felipe.contreras@gmail.com
> > wrote:
> 
> > No activity since 2010, no tests.
> >
> > Cc: Tim Henigan <tim.henigan@gmail.com>
> > Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
> > ---
> >  contrib/diffall/README      |  31 ------
> >  contrib/diffall/git-diffall | 257
> > --------------------------------------------
> >  2 files changed, 288 deletions(-)
> >  delete mode 100644 contrib/diffall/README
> >  delete mode 100755 contrib/diffall/git-diffall
> >
> 
> 
> I see no problem with removing this script from contrib.  However, the
> commit message should mention that git-difftool learned all the
> features of git-diffall when the '--dir-diff' option was added in
> v1.7.11 (ca. June 2012).

Will do.

> Also, the script was first added to contrib in Feb. 2012, so "no
> activity since 2010" is incorrect.

Ah, sorry about that.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 00/25] contrib: cleanup
  2014-05-09  2:01   ` Felipe Contreras
  2014-05-09 13:15     ` Stefan Beller
@ 2014-05-09 15:22     ` Jeff King
  2014-05-09 15:57       ` Felipe Contreras
  1 sibling, 1 reply; 83+ messages in thread
From: Jeff King @ 2014-05-09 15:22 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: Martin Langhoff, Git Mailing List, Junio C Hamano

On Thu, May 08, 2014 at 09:01:32PM -0500, Felipe Contreras wrote:

> > Are you planning on CC'ing the (inactive) authors/maintainers
> > so they know that if they care they should host those elsewhere?
> 
> They are already Cc'ed.

I don't think you were very thorough on this. Of the three remaining
contrib projects I authored (and for which I am the top shortlog entry),
you cc'd me on one. For contrib/persistent-https, you did not cc Colby,
who is the sole author. I didn't look beyond that.

If we are going to remove projects so they can be maintained out of
tree, it seems like the prudent thing to do is make sure the original
author is aware so that they can actually start maintaining it out of
tree.

-Peff

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 23/25] contrib: remove 'hooks/multimail'
  2014-05-09 15:04     ` David Kastrup
@ 2014-05-09 15:28       ` Michael Haggerty
  0 siblings, 0 replies; 83+ messages in thread
From: Michael Haggerty @ 2014-05-09 15:28 UTC (permalink / raw)
  To: David Kastrup; +Cc: Felipe Contreras, git, Junio C Hamano

On 05/09/2014 05:04 PM, David Kastrup wrote:
> Michael Haggerty <mhagger@alum.mit.edu> writes:
> 
>> On 05/09/2014 02:58 AM, Felipe Contreras wrote:
>>> No tests. No chance of ever graduating.
>>>
>>> Already out-of-tree.
>>>
>>> Cc: Michael Haggerty <mhagger@alum.mit.edu>
>>> Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
>>
>> Thank you for your input.
>>
>> git-multimail is maintained outside of the Git project and is only
>> distributed along with Git as a convenience to Git users.  It does in
>> fact have a test suite, along with some other bits and bobs that are not
>> needed to use it, in the upstream repository at
>>
>>     https://github.com/mhagger/git-multimail
>>
>> What's more, it has a maintainer who doesn't routinely insult other
>> people on the mailing list, conduct endless and pointless flame wars,
>> think that he is superior to everybody in sight, and throw temper
>> tantrums when his rudeness, argumentativeness, and arrogance for some
>> reason don't win the hearts and minds of other contributors.
> 
> Oh come on.  Junio is not _that_ bad.

lol

I would explicitly like to thank Junio for being so patient,
imperturbable, and helpful (not to mention hard-working!).  His prompt
and always thoughtful feedback was one of the big reasons that I got
involved in Git development in the first place.

In particular, I would like to say that I am in 100% disagreement with
the criticism of Junio that some people have deFeCated onto the list
recently [1].  Junio, please don't for a minute think that the trolls'
opinions are shared by others [2].

Michael

[1] Actually, it was only one person.
[2] Actually, it is only one troll.

-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 00/25] contrib: cleanup
  2014-05-09 15:22     ` Jeff King
@ 2014-05-09 15:57       ` Felipe Contreras
  2014-05-09 17:09         ` Martin Langhoff
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 15:57 UTC (permalink / raw)
  To: Jeff King, Felipe Contreras
  Cc: Martin Langhoff, Git Mailing List, Junio C Hamano

Jeff King wrote:
> On Thu, May 08, 2014 at 09:01:32PM -0500, Felipe Contreras wrote:
> 
> > > Are you planning on CC'ing the (inactive) authors/maintainers
> > > so they know that if they care they should host those elsewhere?
> > 
> > They are already Cc'ed.
> 
> I don't think you were very thorough on this. Of the three remaining
> contrib projects I authored (and for which I am the top shortlog entry),
> you cc'd me on one. For contrib/persistent-https, you did not cc Colby,
> who is the sole author. I didn't look beyond that.

I already explained:
> That's right, and they are Cc'ed so they can respond.  Some tools have
> only one commit or two, and in those I didn't even bother Cc'ing
> anyone.

contrib/persistent-https consist of a *single* commit, I didn't bother
with those.

> If we are going to remove projects so they can be maintained out of
> tree, it seems like the prudent thing to do is make sure the original
> author is aware so that they can actually start maintaining it out of
> tree.

And how do you determine the author? We don't have a MAINTAINERS like
Linux. Is it the first commit?

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 07/25] contrib: remove 'git-jump'
  2014-05-09 15:20       ` Jeff King
@ 2014-05-09 16:13         ` Felipe Contreras
  2014-05-09 17:37         ` Junio C Hamano
  1 sibling, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 16:13 UTC (permalink / raw)
  To: Jeff King, Felipe Contreras; +Cc: git, Junio C Hamano

Jeff King wrote:
> On Thu, May 08, 2014 at 09:12:36PM -0500, Felipe Contreras wrote:
> 
> > Jeff King wrote:
> > > On Thu, May 08, 2014 at 07:58:18PM -0500, Felipe Contreras wrote:
> > > 
> > > > No activity, no tests.
> > > 
> > > Like diff-highlight, I don't think "no activity" is a useful indicator.
> > > I use this daily, and several people have commented off-list to me that
> > > they use it, too.
> > 
> > Add tests then.
> 
> I don't really feel like spending time on it right now. There are better
> uses of my time.
> 
> I thought on this for a while before responding. Am I simply being lazy
> and a bad programmer not to write tests?

It depends how you define "lazy". Some people think laziness is a good
quality in a programmer.

> Am I propagating a double standard where I do not have to write tests?

Only if you are imposing those standards onto others. It doesn't seem
like you are doing it, but Junio is.

> Here's the conclusion I came to. Sure, some tests are better than no
> tests. But the code works, empirically; I use it every day. It is not
> changing, so the chances of regression are low. I can spend an hour
> writing tests that demonstrate what I already know. I can even spend
> several hours trying to come up with torture cases that might
> demonstrate a potential failure that nobody in the real world
> experiences. But why?
> 
> Because YOU, who have no interest whatsoever in either this script or
> diff-highlight, have decided to demand that I write them, or spend time
> spinning the code into its own repository. Sorry, but I have more useful
> things to do than appease you.

Nobody is forcing you to do anything. If you don't want to write tests,
move the code out of git.git, there's hundreads of tools out there
out-of-tree, and they don't have tests either.

The purpose of contrib is very clearly defined in contrib/README, and
nowhere does it say that tools belong there if Peff uses them. You need
more than that to belong in contrib.

> I have no problem with cleaning up cruft in contrib that is broken and
> nobody uses; it is a potential hazard and time-waster for people who
> look in that directory. But when people say "no, this is maintained, I
> use it, and it works", I really don't see the point in you arguing with
> them. Nobody benefits.

Then you need to talk to Junio, because it really doesn't make sense to
have such abismally different double standards.

> > It this is never meant to move to the core, then it should go
> > out-of-tree anyway.
> 
> "should" in your opinion. I know, I know, you will quote contrib/README
> at me.  If Junio wants to enforce "contrib is only for things which are
> meant to graduate" in his tree, then I will abide by that and maintain
> these scripts out-of-tree. But I would rather see an actual decision
> from the maintainer on that, and not an 8-year-old README which clearly
> has not been followed in the intervening years.

Exactly. Junio has to decide what is the standard for contrib, and what
is the standard for the core. And right now we have incredibly crappy
and unmaintained tools in contrib that nobody uses, as well as
production ready which are in better shape than some tools in the core.

This huge discrepancy should not be.

> And speaking of wasted time, I do not plan on responding further to you
> in this thread. I am telling you ahead of time that this is the case,
> because elsewhere[1] I saw you complaining that Junio did not respond to
> your emails,

Respond or not, the issue about the discrepancy of standards remains.

> which you seemed to think was because he cannot admit that he was
> wrong.

Why he didn't do it is irrelevant, the fact is that he didn't do it.
Other people wonder what is the reponse to these questions. If he
doesn't do it, that's on him.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 23/25] contrib: remove 'hooks/multimail'
  2014-05-09 15:18     ` Felipe Contreras
@ 2014-05-09 16:46       ` James Denholm
  0 siblings, 0 replies; 83+ messages in thread
From: James Denholm @ 2014-05-09 16:46 UTC (permalink / raw)
  To: Felipe Contreras, Michael Haggerty, git; +Cc: Junio C Hamano

Felipe Contreras <felipe.contreras@gmail.com> wrote:
>Michael Haggerty wrote:
>> What's more, it has a maintainer who doesn't routinely insult other
>> people on the mailing list,
>
>Aaand skiping the rest. Good bye.

Aww, Felipe, it's no fair when you ignore other people's
slag. How ever will anyone argue with you if you don't let
them descend to your level?

Regards,
James Denholm.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09  1:51   ` Jeff King
  2014-05-09  1:55     ` Felipe Contreras
@ 2014-05-09 17:04     ` Junio C Hamano
  2014-05-09 17:45       ` Felipe Contreras
  1 sibling, 1 reply; 83+ messages in thread
From: Junio C Hamano @ 2014-05-09 17:04 UTC (permalink / raw)
  To: Jeff King; +Cc: git

Jeff King <peff@peff.net> writes:

> On Thu, May 08, 2014 at 07:58:30PM -0500, Felipe Contreras wrote:
>
>> No activity since 2012, no tests, no chance of ever graduating.
>
> I don't think "no activity" is an interesting indicator. This tool _is_
> actively maintained, but it has not needed any fixes since 2012. I use
> it for every single "git log" and "git diff" invocation I do via the
> pager.* config.
>
> If we are getting rid of contrib/ I would be happy to continue
> maintaining it out-of-tree.

I do not know how much attention you have been paying, and I suspect
that you may be aware of all of the following, but I'll send this
out anyway, primarily so that others involved in other subthreads
can find out the story behind this.

There is no "prove yourself is worthy or get evicted" purge going on
in the contrib/ area.  I saw contrib/README referred to a few times
in the near-by threads, and I think these patches are done primarily
by deliberately misinterpreting one part of it in order to grab
attention by many people and also to sabotage the project.

The contrib/README file was written back when Git was still a small
and young project that was trying to build an ecosystem by having an
area to host stuff that are not core-material for some reason or
other (e.g.  only useful in some environments, only useful for some
workflows, the design or code not up to par to be in core) in my
tree to ease discovery and distribution.

There, I wrote:

    I expect that things that start their life in the contrib/ area
    to graduate out of contrib/ once they mature, either by becoming
    projects on their own, or moving to the toplevel directory.  On
    the other hand, I expect I'll be proposing removal of disused
    and inactive ones from time to time.

The purpose the last sentence in that paragraph is there was to
protect our codebase and our users from those who see an opportunity
to throw their ware in to our tree and go AWOL, by giving me, the
maintainer, a "stick" to prod them, saying "You as the primary
author are responsible for taking good care of the ware you created
by responding to issues (questions, suggestions, bugs, patches) in a
prompt manner, or your ware may even get evicted."

Among contrib/ materials we have today, I do not think there is
anything that requires me to exercise that "stick".  diff-highlight
certainly is not.  Perhaps subtree is the closest, as I see issues
raised from time to time but the original champion seems to be
inactive for some time, but even there, I recently saw somebody
hinting to volunteer to take it over after sending a patch or two to
it, and I do not intend to exercise the "stick" yet.

The sole mention of possible removal from contrib/ is this one:

    http://thread.gmane.org/gmane.comp.version-control.git/248063/focus=248457

in which Felipe said:

    I don't want to do anything for a "contrib" tool.

and I suggested that he has an option to make it a standalone
third-party project.  With the promotion to the core has already
been ruled out in the thread that begins at this one:

    http://thread.gmane.org/gmane.comp.version-control.git/247660/focus=248167

that is one of the only two alternatives I can offer, given that the
Git ecosystem has matured enough to let third-party tools flourish
on their own merit.  "We may want a better plug-in registry for Git"
I mentioned in

    http://thread.gmane.org/gmane.comp.version-control.git/248063/focus=248391

was to help us in that direction, but seeing that imerge mentioned
in many places I do not even regularly visit with the current
"discovery and distribution" infrastructure, perhaps yet another new
registry may not even be necessary.  I dunno.

In any case, that suggestion to remove not related to the "stick",
either, and certeinly not about "prove yourself" purge that does not
even exist.

So I think most of these removal patches can safely be ignored.

I agree with you and Jonathan that removal of contrib/vim may be a
good idea, but that is not due to "stick" nor "prove yourself",
either.  Jonathan's proposed alternative $gmane/248506 does a good
job of explaining and justifying the change.  It is a graduation "by
becoming projects on their own" that contrib/README mentions.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 00/25] contrib: cleanup
  2014-05-09 15:57       ` Felipe Contreras
@ 2014-05-09 17:09         ` Martin Langhoff
  2014-05-09 17:15           ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: Martin Langhoff @ 2014-05-09 17:09 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: Jeff King, Git Mailing List, Junio C Hamano

On Fri, May 9, 2014 at 11:57 AM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> I already explained:
>> That's right, and they are Cc'ed so they can respond.  Some tools have
>> only one commit or two, and in those I didn't even bother Cc'ing
>> anyone.
>
> contrib/persistent-https consist of a *single* commit, I didn't bother
> with those.

!?

That single commit is the "merge" into contrib. It may have had a dev
history before.

> And how do you determine the author? We don't have a MAINTAINERS like
> Linux. Is it the first commit?

git blame, aggregate lines against each name?

There was a tool for that discussed a couple years ago, can't remember
name. I used it to find tha lines to my name have shrunk in all my
years inactive :-/



m

-- 
 martin.langhoff@gmail.com
 -  ask interesting questions
 - don't get distracted with shiny stuff  - working code first
 ~ http://docs.moodle.org/en/User:Martin_Langhoff

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 00/25] contrib: cleanup
  2014-05-09 17:09         ` Martin Langhoff
@ 2014-05-09 17:15           ` Felipe Contreras
  0 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 17:15 UTC (permalink / raw)
  To: Martin Langhoff, Felipe Contreras
  Cc: Jeff King, Git Mailing List, Junio C Hamano

Martin Langhoff wrote:
> On Fri, May 9, 2014 at 11:57 AM, Felipe Contreras
> <felipe.contreras@gmail.com> wrote:
> > I already explained:
> >> That's right, and they are Cc'ed so they can respond.  Some tools have
> >> only one commit or two, and in those I didn't even bother Cc'ing
> >> anyone.
> >
> > contrib/persistent-https consist of a *single* commit, I didn't bother
> > with those.
> 
> That single commit is the "merge" into contrib. It may have had a dev
> history before.

It may, but from git.git's perspective it has no activity.

Either way it's written in Go. I fail to see why Go can be tolerated
while Ruby and any other language can't. Only C, perl, sh, or python.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 07/25] contrib: remove 'git-jump'
  2014-05-09 15:20       ` Jeff King
  2014-05-09 16:13         ` Felipe Contreras
@ 2014-05-09 17:37         ` Junio C Hamano
  1 sibling, 0 replies; 83+ messages in thread
From: Junio C Hamano @ 2014-05-09 17:37 UTC (permalink / raw)
  To: Jeff King; +Cc: Felipe Contreras, git

Jeff King <peff@peff.net> writes:

> And speaking of wasted time, I do not plan on responding further to you
> in this thread. I am telling you ahead of time that this is the case,
> because elsewhere[1] I saw you complaining that Junio did not respond to
> your emails, which you seemed to think was because he cannot admit that
> he was wrong. So I want to say up front that I am going to avoid
> interacting with you further because it generally seems fruitless,
> consumes a large amount of time, and causes me a great deal of stress.
>
> -Peff
>
> [1] http://article.gmane.org/gmane.comp.version-control.git/248441

Heh, well said.  I'll follow suit, then.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09 17:04     ` Junio C Hamano
@ 2014-05-09 17:45       ` Felipe Contreras
  2014-05-09 18:06         ` Junio C Hamano
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 17:45 UTC (permalink / raw)
  To: Junio C Hamano, Jeff King; +Cc: git

Junio C Hamano wrote:
> There is no "prove yourself is worthy or get evicted" purge going on
> in the contrib/ area.  I saw contrib/README referred to a few times
> in the near-by threads, and I think these patches are done primarily
> by deliberately misinterpreting one part of it in order to grab
> attention by many people and also to sabotage the project.

*You* said this[1]:

 - Eject tools in contrib/ that would benefit the users better if
   they were outside my tree.  There are a few points to consider
   when judging "benefit better if outside":

   * Their release cycle requirements are better met outside my tree
     (the "remote-hg depends not just on Git but Hg internal" issue
     we have discussed).

   * They are actively maintained.  The overall Git maintainer would
     merely be being a bottleneck than being a helpful editor with
     respect to these tools if we keep them in my tree, and we
     expect that the tool maintainer would do a much better job
     without me.

 - Keep tools that are not actively maintained but still used by the
   users widely in my tree, but when their external dependencies
   become baggage to Git as a whole, demote them to contrib/ and
   stop installing them by default.

 - I would not mind having install.contrib-frotz target in the
   top-level Makefile for each of the remaining contrib/frotz
   hierarchies for those users and distro packagers who know their
   platform meets the dependency requirements.

So make up your mind. Which tools should be ejected from contrib and for
what reasons?

> The contrib/README file was written back when Git was still a small
> and young project

If contrib/README is not appropriate, then rewrite it. Having a
maintainer making decisions about what goes in and goes outs arbitrarily
helps no one.

Or just remove it and be done with the pretense of haing any
consistency.

> The sole mention of possible removal from contrib/ is this one:

Now you are contradicting what you said in [1]. Surely git-remote-hg/bzr
aren't the only tools that meet the criteria you set in [1].

> in which Felipe said:
> 
>     I don't want to do anything for a "contrib" tool.
> 
> and I suggested that he has an option to make it a standalone
> third-party project.

You are twisting the events incredibly. *You* started by threatening the
removal[2]:

> Having said that, I agree with the conclusion of your message:...
> and I am inclined to be persuaded that the users of remote-hg/bzr
> may better off if they are unbundled from my tree.

I said I wasn't interested in working on this *after* you said they were
not going to the core, and they should move out-of-tree.

> that is one of the only two alternatives I can offer, given that the
> Git ecosystem has matured enough to let third-party tools flourish
> on their own merit.

But it hasn't matured enough. That's *YOUR ASSUMPTION*.

Look at all the fuzz my patch series has created. Does it seem to you
these are the symptoms of an ecosystem mature enough to let third-party
tools to flourish?

If you think so, then let's continue cleaning up contrib. These tools
will "flourish" according to you.

> In any case, that suggestion to remove not related to the "stick",
> either, and certeinly not about "prove yourself" purge that does not
> even exist.
> 
> So I think most of these removal patches can safely be ignored.

Excellent, so you agree you engage in double standards. Tools stay in
the core even when they haven't proven themselves (and even without
tests), tools get dropped from the tree even when they have proven
themselves.

Got it.

[1] http://article.gmane.org/gmane.comp.version-control.git/248233
[2] http://article.gmane.org/gmane.comp.version-control.git/248242

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09 17:45       ` Felipe Contreras
@ 2014-05-09 18:06         ` Junio C Hamano
  2014-05-09 18:21           ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: Junio C Hamano @ 2014-05-09 18:06 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: Jeff King, git

Felipe Contreras <felipe.contreras@gmail.com> writes:

> *You* said this[1]:

If you read the context you omitted from the quote, and realize that
it was a counter-suggestion to give a middle ground to a more
draconian "let's divide them into two", neither which I said I want
to see go forward immediately, you see that this message does not
deserve any response.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09 18:06         ` Junio C Hamano
@ 2014-05-09 18:21           ` Felipe Contreras
  2014-05-09 18:29             ` Junio C Hamano
  0 siblings, 1 reply; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 18:21 UTC (permalink / raw)
  To: Junio C Hamano, Felipe Contreras; +Cc: Jeff King, git

Junio C Hamano wrote:
> Felipe Contreras <felipe.contreras@gmail.com> writes:
> 
> > *You* said this[1]:
> 
> If you read the context you omitted from the quote, and realize that
> it was a counter-suggestion to give a middle ground to a more
> draconian "let's divide them into two", neither which I said I want
> to see go forward immediately, you see that this message does not
> deserve any response.

So when you came with a guideline, that was only for git-remote-hg/bzr.
If you apply that guideline to other tools, you would have to remove
them too, but that won't happen regarlesss of how crappy or well
maintained they are out-of-tree already.

Why? Because you say so. OK.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09 18:21           ` Felipe Contreras
@ 2014-05-09 18:29             ` Junio C Hamano
  2014-05-09 18:40               ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: Junio C Hamano @ 2014-05-09 18:29 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: Jeff King, git

Felipe Contreras <felipe.contreras@gmail.com> writes:

> Junio C Hamano wrote:
>> Felipe Contreras <felipe.contreras@gmail.com> writes:
>> 
>> > *You* said this[1]:
>> 
>> If you read the context you omitted from the quote, and realize that
>> it was a counter-suggestion to give a middle ground to a more
>> draconian "let's divide them into two", neither which I said I want
>> to see go forward immediately, you see that this message does not
>> deserve any response.
>
> So when you came with a guideline, that was only for git-remote-hg/bzr.

There is no guideline involved.  Go re-read the message upthread and
find this part:

    In any case, that suggestion to remove not related to the "stick",
    either, and certeinly not about "prove yourself" purge that does not
    even exist.

I have no more time nor desire to respond to you today.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 04/25] contrib: remove 'buildsystems'
  2014-05-09  8:33       ` Erik Faye-Lund
  2014-05-09  8:48         ` Felipe Contreras
@ 2014-05-09 18:33         ` Jonathan Nieder
  1 sibling, 0 replies; 83+ messages in thread
From: Jonathan Nieder @ 2014-05-09 18:33 UTC (permalink / raw)
  To: Erik Faye-Lund
  Cc: Felipe Contreras, GIT Mailing-list, Junio C Hamano, Marius Storm-Olsen

Hi,

Erik Faye-Lund wrote:
> On Fri, May 9, 2014 at 10:14 AM, Felipe Contreras
> <felipe.contreras@gmail.com> wrote:
>> Erik Faye-Lund wrote:

>>> Please don't. This script is useful to build with the MSVC IDE, which
>>> enables us to use their excellent debugger.
>>
>> If you want this script to remain in contrib, please:
>>
>>  a) Write at least a few tests
>>  b) Write some documentation
>>  c) Explain why it cannot live outside the git.git repository like other
>>     tools. [1][2][3]
>
> (Adding Marius, the original author to the CC-list)
>
> Uh, why is such a burden required all of a sudden?

It isn't.  As far as I can tell, the only point of this patch series
was to prove a point.  If a patch from the series happens to be useful
then that's great, but otherwise it's mostly an act of protest as far
as I can tell.

(From my point of view, this kind of protest is not really a good way
to reward people who have made good contributions to contrib/ in the
past, so I hope it doesn't happen often.)

I'm happy the MSVC build scripts are in git.git.  Thanks for keeping
them maintained well.

Sincerely,
Jonathan

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 19/25] contrib: remove 'diff-highlight'
  2014-05-09 18:29             ` Junio C Hamano
@ 2014-05-09 18:40               ` Felipe Contreras
  0 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-09 18:40 UTC (permalink / raw)
  To: Junio C Hamano, Felipe Contreras; +Cc: Jeff King, git

Junio C Hamano wrote:
> Felipe Contreras <felipe.contreras@gmail.com> writes:
> 
> > Junio C Hamano wrote:
> >> Felipe Contreras <felipe.contreras@gmail.com> writes:
> >> 
> >> > *You* said this[1]:
> >> 
> >> If you read the context you omitted from the quote, and realize that
> >> it was a counter-suggestion to give a middle ground to a more
> >> draconian "let's divide them into two", neither which I said I want
> >> to see go forward immediately, you see that this message does not
> >> deserve any response.
> >
> > So when you came with a guideline, that was only for git-remote-hg/bzr.
> 
> There is no guideline involved.

Exactly. It's all arbitrary.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 06/25] contrib: remove 'diffall'
  2014-05-09 15:12   ` Tim Henigan
@ 2014-05-09 18:50     ` Jonathan Nieder
  2014-05-09 19:26       ` Tim Henigan
  0 siblings, 1 reply; 83+ messages in thread
From: Jonathan Nieder @ 2014-05-09 18:50 UTC (permalink / raw)
  To: Tim Henigan; +Cc: Felipe Contreras, Git Mailing List, Junio C Hamano

Hi Tim,

Tim Henigan wrote:
> On Thu, May 8, 2014 at 5:58 PM, Felipe Contreras
> <felipe.contreras@gmail.com> wrote:

>>  contrib/diffall/README      |  31 ------
>>  contrib/diffall/git-diffall | 257 --------------------------------------------
>>  2 files changed, 288 deletions(-)
>>  delete mode 100644 contrib/diffall/README
>>  delete mode 100755 contrib/diffall/git-diffall
>
> I see no problem with removing this script from contrib.  However, the commit message
> should mention that git-difftool learned all the features of git-diffall when the '--dir-diff'
> option was added in v1.7.11 (ca. June 2012).

A few questions:

 * Do you still use git-diffall?  Since it hasn't been a maintenance
   burden, I wouldn't mind keeping it if it still has users.

 * Any thoughts about how to help people who have been using it to
   migrate to difftool?  Would a note in the release notes to look
   into the --dir-diff option to difftool be enough, or are there
   more specific pointers that could be useful?

Once those questions are dealt with, this seems like a nice small
cleanup.  Thanks for the quick feedback.

Hope that helps,
Jonathan

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 06/25] contrib: remove 'diffall'
  2014-05-09 18:50     ` Jonathan Nieder
@ 2014-05-09 19:26       ` Tim Henigan
  2014-05-09 20:12         ` Jonathan Nieder
  0 siblings, 1 reply; 83+ messages in thread
From: Tim Henigan @ 2014-05-09 19:26 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: Felipe Contreras, Git Mailing List, Junio C Hamano

Hi Jonathan,

On Fri, May 9, 2014 at 11:50 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:
> Hi Tim,
>
> Tim Henigan wrote:
>> On Thu, May 8, 2014 at 5:58 PM, Felipe Contreras
>> <felipe.contreras@gmail.com> wrote:
>
>>>  contrib/diffall/README      |  31 ------
>>>  contrib/diffall/git-diffall | 257 --------------------------------------------
>>>  2 files changed, 288 deletions(-)
>>>  delete mode 100644 contrib/diffall/README
>>>  delete mode 100755 contrib/diffall/git-diffall
>>
>> I see no problem with removing this script from contrib.  However, the commit message
>> should mention that git-difftool learned all the features of git-diffall when the '--dir-diff'
>> option was added in v1.7.11 (ca. June 2012).
>
> A few questions:
>
>  * Do you still use git-diffall?  Since it hasn't been a maintenance
>    burden, I wouldn't mind keeping it if it still has users.

I have not used diffall since a few months after the difftool '--dir-diff'
option was released.  Once difftool learned those features, the
diffall script became obsolete.

For people using older git (i.e. before v1.7.11), it may still be useful.
For them, the original out-of-tree repo remains available on github [1].

[1]: https://github.com/thenigan/git-diffall


>  * Any thoughts about how to help people who have been using it to
>    migrate to difftool?  Would a note in the release notes to look
>    into the --dir-diff option to difftool be enough, or are there
>    more specific pointers that could be useful?

Pointing to 'difftool --dir-diff' should be enough.

The only change in behavior is that when a working tree file is part
of the diff and is modified during the diff, 'difftool --dir-diff' automatically
keeps the modifications.  The 'diffall' script required the user to use
the '--copy-back' option to do the same.

All other options are exactly the same.


> Once those questions are dealt with, this seems like a nice small
> cleanup.  Thanks for the quick feedback.

If it would be helpful, I can send a patch that replaces the contents
of 'contrib/diffall' with a README that explains the above and points
to the github repo for people using versions of git prior to v1.7.11.
This would be similar to what was done for 'contrib/vim'.

However, I like the idea of simply removing the directory from contrib
and pointing to 'difftool --dir-diff' in the release notes.

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 00/25] contrib: cleanup
  2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
                   ` (24 preceding siblings ...)
       [not found] ` <1399597116-1851-24-git-send-email-felipe.contreras@gmail.com>
@ 2014-05-09 19:56 ` Johannes Sixt
  25 siblings, 0 replies; 83+ messages in thread
From: Johannes Sixt @ 2014-05-09 19:56 UTC (permalink / raw)
  To: Git Mailing List

I know I'm late in the show, but can we please, PLEASE

  *NOT* feed the troll?

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 06/25] contrib: remove 'diffall'
  2014-05-09 19:26       ` Tim Henigan
@ 2014-05-09 20:12         ` Jonathan Nieder
  2014-05-09 20:16           ` Tim Henigan
  0 siblings, 1 reply; 83+ messages in thread
From: Jonathan Nieder @ 2014-05-09 20:12 UTC (permalink / raw)
  To: Tim Henigan; +Cc: Felipe Contreras, Git Mailing List, Junio C Hamano

Hi,

Tim Henigan wrote:

> However, I like the idea of simply removing the directory from contrib
> and pointing to 'difftool --dir-diff' in the release notes.

Thanks.  I believe Junio uses commit messages as reference when
writing release notes so hopefully this should be enough to make that
happen.

-- >8 --
Subject: contrib: remove git-diffall

The functionality of the "git diffall" script in contrib/ was
incorporated into "git difftool" when the --dir-diff option was added
in v1.7.11 (ca. June, 2012).  Once difftool learned those features,
the diffall script became obsolete.

The only difference in behavior is that when comparing to the working
tree, difftool copies any files modified by the user back to the
working tree when the diff tool exits.  "git diffall" required the
--copy-back option to do the same.  All other diffall options have the
same meaning in difftool.

Make life easier for people choosing a tool to use by removing the old
diffall script.  A pointer in the release notes should be enough to
help current users migrate.

Helped-by: Tim Henigan <tim.henigan@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 contrib/diffall/README      |  31 ------
 contrib/diffall/git-diffall | 257 --------------------------------------------
 2 files changed, 288 deletions(-)
 delete mode 100644 contrib/diffall/README
 delete mode 100755 contrib/diffall/git-diffall

diff --git a/contrib/diffall/README b/contrib/diffall/README
deleted file mode 100644
index 507f17d..0000000
--- a/contrib/diffall/README
+++ /dev/null
@@ -1,31 +0,0 @@
-The git-diffall script provides a directory based diff mechanism
-for git.
-
-To determine what diff viewer is used, the script requires either
-the 'diff.tool' or 'merge.tool' configuration option to be set.
-
-This script is compatible with most common forms used to specify a
-range of revisions to diff:
-
-  1. git diffall: shows diff between working tree and staged changes
-  2. git diffall --cached [<commit>]: shows diff between staged
-     changes and HEAD (or other named commit)
-  3. git diffall <commit>: shows diff between working tree and named
-     commit
-  4. git diffall <commit> <commit>: show diff between two named commits
-  5. git diffall <commit>..<commit>: same as above
-  6. git diffall <commit>...<commit>: show the changes on the branch
-     containing and up to the second, starting at a common ancestor
-     of both <commit>
-
-Note: all forms take an optional path limiter [-- <path>*]
-
-The '--extcmd=<command>' option allows the user to specify a custom
-command for viewing diffs.  When given, configured defaults are
-ignored and the script runs $command $LOCAL $REMOTE.  Additionally,
-$BASE is set in the environment.
-
-This script is based on an example provided by Thomas Rast on the
-Git list [1]:
-
-[1] http://thread.gmane.org/gmane.comp.version-control.git/124807
diff --git a/contrib/diffall/git-diffall b/contrib/diffall/git-diffall
deleted file mode 100755
index 84f2b65..0000000
--- a/contrib/diffall/git-diffall
+++ /dev/null
@@ -1,257 +0,0 @@
-#!/bin/sh
-# Copyright 2010 - 2012, Tim Henigan <tim.henigan@gmail.com>
-#
-# Perform a directory diff between commits in the repository using
-# the external diff or merge tool specified in the user's config.
-
-USAGE='[--cached] [--copy-back] [-x|--extcmd=<command>] <commit>{0,2} [-- <path>*]
-
-    --cached     Compare to the index rather than the working tree.
-
-    --copy-back  Copy files back to the working tree when the diff
-                 tool exits (in case they were modified by the
-                 user).  This option is only valid if the diff
-                 compared with the working tree.
-
-    -x=<command>
-    --extcmd=<command>  Specify a custom command for viewing diffs.
-                 git-diffall ignores the configured defaults and
-                 runs $command $LOCAL $REMOTE when this option is
-                 specified. Additionally, $BASE is set in the
-                 environment.
-'
-
-SUBDIRECTORY_OK=1
-. "$(git --exec-path)/git-sh-setup"
-
-TOOL_MODE=diff
-. "$(git --exec-path)/git-mergetool--lib"
-
-merge_tool="$(get_merge_tool)"
-if test -z "$merge_tool"
-then
-	echo "Error: Either the 'diff.tool' or 'merge.tool' option must be set."
-	usage
-fi
-
-start_dir=$(pwd)
-
-# All the file paths returned by the diff command are relative to the root
-# of the working copy. So if the script is called from a subdirectory, it
-# must switch to the root of working copy before trying to use those paths.
-cdup=$(git rev-parse --show-cdup) &&
-cd "$cdup" || {
-	echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree"
-	exit 1
-}
-
-# set up temp dir
-tmp=$(perl -e 'use File::Temp qw(tempdir);
-	$t=tempdir("/tmp/git-diffall.XXXXX") or exit(1);
-	print $t') || exit 1
-trap 'rm -rf "$tmp"' EXIT
-
-left=
-right=
-paths=
-dashdash_seen=
-compare_staged=
-merge_base=
-left_dir=
-right_dir=
-diff_tool=
-copy_back=
-
-while test $# != 0
-do
-	case "$1" in
-	-h|--h|--he|--hel|--help)
-		usage
-		;;
-	--cached)
-		compare_staged=1
-		;;
-	--copy-back)
-		copy_back=1
-		;;
-	-x|--e|--ex|--ext|--extc|--extcm|--extcmd)
-		if test $# = 1
-		then
-			echo You must specify the tool for use with --extcmd
-			usage
-		else
-			diff_tool=$2
-			shift
-		fi
-		;;
-	--)
-		dashdash_seen=1
-		;;
-	-*)
-		echo Invalid option: "$1"
-		usage
-		;;
-	*)
-		# could be commit, commit range or path limiter
-		case "$1" in
-		*...*)
-			left=${1%...*}
-			right=${1#*...}
-			merge_base=1
-			;;
-		*..*)
-			left=${1%..*}
-			right=${1#*..}
-			;;
-		*)
-			if test -n "$dashdash_seen"
-			then
-				paths="$paths$1 "
-			elif test -z "$left"
-			then
-				left=$1
-			elif test -z "$right"
-			then
-				right=$1
-			else
-				paths="$paths$1 "
-			fi
-			;;
-		esac
-		;;
-	esac
-	shift
-done
-
-# Determine the set of files which changed
-if test -n "$left" && test -n "$right"
-then
-	left_dir="cmt-$(git rev-parse --short $left)"
-	right_dir="cmt-$(git rev-parse --short $right)"
-
-	if test -n "$compare_staged"
-	then
-		usage
-	elif test -n "$merge_base"
-	then
-		git diff --name-only "$left"..."$right" -- $paths >"$tmp/filelist"
-	else
-		git diff --name-only "$left" "$right" -- $paths >"$tmp/filelist"
-	fi
-elif test -n "$left"
-then
-	left_dir="cmt-$(git rev-parse --short $left)"
-
-	if test -n "$compare_staged"
-	then
-		right_dir="staged"
-		git diff --name-only --cached "$left" -- $paths >"$tmp/filelist"
-	else
-		right_dir="working_tree"
-		git diff --name-only "$left" -- $paths >"$tmp/filelist"
-	fi
-else
-	left_dir="HEAD"
-
-	if test -n "$compare_staged"
-	then
-		right_dir="staged"
-		git diff --name-only --cached -- $paths >"$tmp/filelist"
-	else
-		right_dir="working_tree"
-		git diff --name-only -- $paths >"$tmp/filelist"
-	fi
-fi
-
-# Exit immediately if there are no diffs
-if test ! -s "$tmp/filelist"
-then
-	exit 0
-fi
-
-if test -n "$copy_back" && test "$right_dir" != "working_tree"
-then
-	echo "--copy-back is only valid when diff includes the working tree."
-	exit 1
-fi
-
-# Create the named tmp directories that will hold the files to be compared
-mkdir -p "$tmp/$left_dir" "$tmp/$right_dir"
-
-# Populate the tmp/right_dir directory with the files to be compared
-while read name
-do
-	if test -n "$right"
-	then
-		ls_list=$(git ls-tree $right "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			git show "$right":"$name" >"$tmp/$right_dir/$name" || true
-		fi
-	elif test -n "$compare_staged"
-	then
-		ls_list=$(git ls-files -- "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			git show :"$name" >"$tmp/$right_dir/$name"
-		fi
-	else
-		if test -e "$name"
-		then
-			mkdir -p "$tmp/$right_dir/$(dirname "$name")"
-			cp "$name" "$tmp/$right_dir/$name"
-		fi
-	fi
-done < "$tmp/filelist"
-
-# Populate the tmp/left_dir directory with the files to be compared
-while read name
-do
-	if test -n "$left"
-	then
-		ls_list=$(git ls-tree $left "$name")
-		if test -n "$ls_list"
-		then
-			mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-			git show "$left":"$name" >"$tmp/$left_dir/$name" || true
-		fi
-	else
-		if test -n "$compare_staged"
-		then
-			ls_list=$(git ls-tree HEAD "$name")
-			if test -n "$ls_list"
-			then
-				mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-				git show HEAD:"$name" >"$tmp/$left_dir/$name"
-			fi
-		else
-			mkdir -p "$tmp/$left_dir/$(dirname "$name")"
-			git show :"$name" >"$tmp/$left_dir/$name"
-		fi
-	fi
-done < "$tmp/filelist"
-
-LOCAL="$tmp/$left_dir"
-REMOTE="$tmp/$right_dir"
-
-if test -n "$diff_tool"
-then
-	export BASE
-	eval $diff_tool '"$LOCAL"' '"$REMOTE"'
-else
-	run_merge_tool "$merge_tool" false
-fi
-
-# Copy files back to the working dir, if requested
-if test -n "$copy_back" && test "$right_dir" = "working_tree"
-then
-	cd "$start_dir"
-	git_top_dir=$(git rev-parse --show-toplevel)
-	find "$tmp/$right_dir" -type f |
-	while read file
-	do
-		cp "$file" "$git_top_dir/${file#$tmp/$right_dir/}"
-	done
-fi
-- 
1.9.1.423.g4596e3a

^ permalink raw reply related	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 06/25] contrib: remove 'diffall'
  2014-05-09 20:12         ` Jonathan Nieder
@ 2014-05-09 20:16           ` Tim Henigan
  0 siblings, 0 replies; 83+ messages in thread
From: Tim Henigan @ 2014-05-09 20:16 UTC (permalink / raw)
  To: Jonathan Nieder; +Cc: Felipe Contreras, Git Mailing List, Junio C Hamano

Hi Jonathan,

On Fri, May 9, 2014 at 1:12 PM, Jonathan Nieder <jrnieder@gmail.com> wrote:
> Hi,
>
> Tim Henigan wrote:
>
>> However, I like the idea of simply removing the directory from contrib
>> and pointing to 'difftool --dir-diff' in the release notes.
>
> Thanks.  I believe Junio uses commit messages as reference when
> writing release notes so hopefully this should be enough to make that
> happen.

The updated commit message looks good to me.  Thanks.

-Tim

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 20/25] contrib: remove 'contacts'
  2014-05-09  0:58 ` [PATCH v1 20/25] contrib: remove 'contacts' Felipe Contreras
@ 2014-05-10  1:59   ` brian m. carlson
  2014-05-10  4:00     ` Felipe Contreras
  0 siblings, 1 reply; 83+ messages in thread
From: brian m. carlson @ 2014-05-10  1:59 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: git, Junio C Hamano, Eric Sunshine

[-- Attachment #1: Type: text/plain, Size: 688 bytes --]

On Thu, May 08, 2014 at 07:58:31PM -0500, Felipe Contreras wrote:
> There are better out-of-tree tools, and this tool is not planned to move
> into the core anyway.

I have used this once or twice, and I have seen others indicate their
use of it as well.  I am not volunteering to maintain this, but if it is
working reasonably well for people (as it appears to be), I don't see a
reason to remove it.

I don't feel I need a CC if a reply is made to this message.

-- 
brian m. carlson / brian with sandals: Houston, Texas, US
+1 832 623 2791 | http://www.crustytoothpaste.net/~bmc | My opinion only
OpenPGP: RSA v4 4096b: 88AC E9B2 9196 305B A994 7552 F1BA 225C 0223 B187

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 83+ messages in thread

* Re: [PATCH v1 20/25] contrib: remove 'contacts'
  2014-05-10  1:59   ` brian m. carlson
@ 2014-05-10  4:00     ` Felipe Contreras
  0 siblings, 0 replies; 83+ messages in thread
From: Felipe Contreras @ 2014-05-10  4:00 UTC (permalink / raw)
  To: brian m. carlson, Felipe Contreras; +Cc: git, Junio C Hamano, Eric Sunshine

brian m. carlson wrote:
> On Thu, May 08, 2014 at 07:58:31PM -0500, Felipe Contreras wrote:
> > There are better out-of-tree tools, and this tool is not planned to move
> > into the core anyway.
> 
> I have used this once or twice, and I have seen others indicate their
> use of it as well.  I am not volunteering to maintain this, but if it is
> working reasonably well for people (as it appears to be), I don't see a
> reason to remove it.

If all it took as qualification for contrib is that "somebody" uses it,
contrib would be festered by tools that right now live out-of-tree.

The reasons why some tools are not dropped from contrib, and others are
rejected to contrib are completely arbitrary.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 83+ messages in thread

end of thread, other threads:[~2014-05-10  4:00 UTC | newest]

Thread overview: 83+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-05-09  0:58 [PATCH v1 00/25] contrib: cleanup Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 02/25] contrib: remove 'hg-to-git' Felipe Contreras
2014-05-09  6:44   ` Miklos Vajna
2014-05-09  0:58 ` [PATCH v1 03/25] contrib: remove 'stats' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 04/25] contrib: remove 'buildsystems' Felipe Contreras
2014-05-09  7:53   ` Erik Faye-Lund
2014-05-09  8:14     ` Felipe Contreras
2014-05-09  8:33       ` Erik Faye-Lund
2014-05-09  8:48         ` Felipe Contreras
2014-05-09  9:10           ` Erik Faye-Lund
2014-05-09  9:32             ` Felipe Contreras
2014-05-09 10:02               ` Erik Faye-Lund
2014-05-09 10:57                 ` Felipe Contreras
2014-05-09 11:35                   ` Erik Faye-Lund
2014-05-09  9:17           ` David Kastrup
2014-05-09  9:35             ` Felipe Contreras
2014-05-09  9:44               ` David Kastrup
2014-05-09 10:50                 ` Felipe Contreras
2014-05-09 11:21                   ` David Kastrup
2014-05-09 18:33         ` Jonathan Nieder
2014-05-09  0:58 ` [PATCH v1 05/25] contrib: remove 'convert-objects' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 06/25] contrib: remove 'diffall' Felipe Contreras
2014-05-09 15:12   ` Tim Henigan
2014-05-09 18:50     ` Jonathan Nieder
2014-05-09 19:26       ` Tim Henigan
2014-05-09 20:12         ` Jonathan Nieder
2014-05-09 20:16           ` Tim Henigan
     [not found]   ` <CAFouetj=30Wd_CDiXA0UqqKNdfJSv+C5mWbMJPOkEdqxr7k54w@mail.gmail.com>
2014-05-09 15:20     ` Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 07/25] contrib: remove 'git-jump' Felipe Contreras
2014-05-09  2:03   ` Jeff King
2014-05-09  2:12     ` Felipe Contreras
2014-05-09 15:20       ` Jeff King
2014-05-09 16:13         ` Felipe Contreras
2014-05-09 17:37         ` Junio C Hamano
2014-05-09  0:58 ` [PATCH v1 08/25] contrib: remove 'git-shell-commands' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 09/25] contrib: remove 'gitview' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 10/25] contrib: reomve 'thunderbird-patch-inline' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 11/25] contrib: remove 'workdir' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 12/25] contrib: remove 'vim' Felipe Contreras
2014-05-09  2:02   ` Jeff King
2014-05-09  2:23     ` Jonathan Nieder
2014-05-09  0:58 ` [PATCH v1 13/25] contrib: remove 'svn-fe' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 14/25] contrib: remove 'rerere-train' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 15/25] contrib: remove 'remotes2config' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 16/25] contrib: remove 'persistent-https' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 17/25] contrib: remove 'git-resurrect' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 18/25] contrib: remove 'emacs' Felipe Contreras
     [not found]   ` <CAFcZeCqbF54-KjHU1R3pC6XgWi21KcpRGB7HcbfSGyvTScQU2A@mail.gmail.com>
2014-05-09  8:29     ` Felipe Contreras
     [not found]       ` <CAFcZeCo5mCfnUN1uBiaZnD6DL6y8hPhK5MPts5raLCTGwJX9Gg@mail.gmail.com>
2014-05-09  8:50         ` Felipe Contreras
2014-05-09 14:50         ` Alexandre Julliard
2014-05-09 14:53           ` Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 19/25] contrib: remove 'diff-highlight' Felipe Contreras
2014-05-09  1:51   ` Jeff King
2014-05-09  1:55     ` Felipe Contreras
2014-05-09 13:37       ` Stefan Beller
2014-05-09 14:16         ` Felipe Contreras
2014-05-09 17:04     ` Junio C Hamano
2014-05-09 17:45       ` Felipe Contreras
2014-05-09 18:06         ` Junio C Hamano
2014-05-09 18:21           ` Felipe Contreras
2014-05-09 18:29             ` Junio C Hamano
2014-05-09 18:40               ` Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 20/25] contrib: remove 'contacts' Felipe Contreras
2014-05-10  1:59   ` brian m. carlson
2014-05-10  4:00     ` Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 22/25] contrib: remove 'fast-import' Felipe Contreras
2014-05-09  0:58 ` [PATCH v1 24/25] contrib: remove 'hooks' Felipe Contreras
2014-05-09  1:47 ` [PATCH v1 00/25] contrib: cleanup Martin Langhoff
     [not found] ` <CACPiFCJnsu3qw59oK94sP1u0+KBDvne0ZpKS0LMGc_9ge+rJjA@mail.gmail.com>
2014-05-09  2:01   ` Felipe Contreras
2014-05-09 13:15     ` Stefan Beller
2014-05-09 15:22     ` Jeff King
2014-05-09 15:57       ` Felipe Contreras
2014-05-09 17:09         ` Martin Langhoff
2014-05-09 17:15           ` Felipe Contreras
     [not found] ` <1399597116-1851-26-git-send-email-felipe.contreras@gmail.com>
2014-05-09 10:46   ` [PATCH v1 25/25] contrib: remove 'mw-to-git' Matthieu Moy
2014-05-09 10:59     ` Felipe Contreras
2014-05-09 12:30       ` Stefan Beller
     [not found] ` <1399597116-1851-24-git-send-email-felipe.contreras@gmail.com>
2014-05-09 15:00   ` [PATCH v1 23/25] contrib: remove 'hooks/multimail' Michael Haggerty
2014-05-09 15:04     ` David Kastrup
2014-05-09 15:28       ` Michael Haggerty
2014-05-09 15:18     ` Felipe Contreras
2014-05-09 16:46       ` James Denholm
2014-05-09 19:56 ` [PATCH v1 00/25] contrib: cleanup Johannes Sixt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.