Merge branch 'release/0.0.1'

This commit is contained in:
Motonori Iwata 2011-09-03 21:27:37 +09:00
commit 6c997f43f9
13 changed files with 314 additions and 87 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "shFlags"]
path = shFlags
url = git://github.com/nvie/shFlags.git

59
Makefile Normal file
View file

@ -0,0 +1,59 @@
#
# Copyright 2010 Vincent Driessen. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY VINCENT DRIESSEN ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL VINCENT DRIESSEN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# The views and conclusions contained in the software and documentation are
# those of the authors and should not be interpreted as representing official
# policies, either expressed or implied, of Vincent Driessen.
#
# Determine if we're inside a debian build ..
ifdef DEB_BUILD_ARCH
prefix=$(DESTDIR)/usr/
else
prefix=/usr/local
endif
# files that need mode 755
EXEC_FILES=git-now
# files that need mode 644
SCRIPT_FILES =git-now-add
SCRIPT_FILES+=git-now-grep
SCRIPT_FILES+=git-now-rebase
SCRIPT_FILES+=gitnow-common
SCRIPT_FILES+=gitnow-shFlags
all:
@echo "usage: make install"
@echo " make uninstall"
install:
install -d -m 0755 $(prefix)/bin
install -m 0755 $(EXEC_FILES) $(prefix)/bin
install -m 0644 $(SCRIPT_FILES) $(prefix)/bin
uninstall:
test -d $(prefix)/bin && \
cd $(prefix)/bin && \
rm -f $(EXEC_FILES) $(SCRIPT_FILES)

View file

89
git-now
View file

@ -1,20 +1,75 @@
#!/bin/sh
PREFIX="from now"
MESSAGE="[${PREFIX}] `date +\"%Y/%m/%d %T\"`"
if [ $# -eq 0 ]
then
git add -u
printf "${MESSAGE}\n\n%s" "`git diff --cached`" | git commit -F -
else
then
if [ $1 != "--all" ]
then
git add $@
else
git add -u
git add .
fi
printf "${MESSAGE}\n\n%s" "`git diff --cached`" | git commit -F -
# enable debug mode
if [ "$DEBUG" = "yes" ]; then
set -x
fi
export GITNOW_DIR=$(dirname "$0")
PREFIX="from now"
usage() {
echo "usage: git now [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]"
echo " [--edit | -e] [--all | [--update | -u]] [--intent-to-add | -N]"
echo " [--refresh] [--ignore-errors] [--ignore-missing] [--]"
echo " [<filepattern>...]"
echo
echo " git now <subcommand>"
echo
echo "Available subcommands are:"
echo " add default subcommand."
echo " rebase rebase for temporary commits."
echo " grep grep temporary commits."
echo
echo "Try 'git now <subcommand> help' for details."
}
main() {
# load common functionality
. "$GITNOW_DIR/gitnow-common"
# This environmental variable fixes non-POSIX getopt style argument
# parsing, effectively breaking git-now subcommand parsing on several
# Linux platforms.
export POSIXLY_CORRECT=1
# use the shFlags project to parse the command line arguments
. "$GITNOW_DIR/gitnow-shFlags"
SUBCOMMAND="$1"
if [ ! -e "$GITNOW_DIR/git-now-$SUBCOMMAND" ]; then
if [ "$SUBCOMMAND" = "help" ]; then
usage
exit 0
else
SUBCOMMAND="add"
fi
else
FLAGS_PARENT="git now"
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"; shift
FLAGS_PARENT="git now $SUBCOMMAND"
fi
# run command
. "$GITNOW_DIR/git-now-$SUBCOMMAND"
# test if the first argument is a flag (i.e. starts with '-')
# in that case, we interpret this arg as a flag for the default
# command
SUBACTION="default"
if [ "$1" = "help" ] && { ! echo "$1" | grep -q "^-"; } then
SUBACTION="$1"; shift
fi
#if ! type "cmd_$SUBACTION" >/dev/null 2>&1; then
#warn "Unknown subcommand: '$SUBACTION'"
#usage
#exit 1
#fi
# run the specified action
cmd_$SUBACTION "$@"
}
main "$@"

28
git-now-add Normal file
View file

@ -0,0 +1,28 @@
usage() {
echo "usage: git now add [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]"
echo " [--edit | -e] [--all | [--update | -u]] [--intent-to-add | -N]"
echo " [--refresh] [--ignore-errors] [--ignore-missing] [--]"
echo " [<filepattern>...]"
}
cmd_default() {
MESSAGE="[${PREFIX}] `date +\"%Y/%m/%d %T\"`"
if [ $# -eq 0 ]; then
git add -u
printf "${MESSAGE}\n\n%s" "`git diff --cached`" | git commit -F -
else
if [ $1 != "--all" ]; then
git add $@
else
git add -u
git add .
fi
printf "${MESSAGE}\n\n%s" "`git diff --cached`" | git commit -F -
fi
}
cmd_help() {
usage
exit 0
}

29
git-now-grep Normal file
View file

@ -0,0 +1,29 @@
usage() {
echo "usage: git now grep [<base_branch>]"
}
cmd_default() {
parse_args "$@"
if [ -n "$BASE_BRANCH" ]; then
WORKING_BRANCH=$(git_current_branch)
COMMON_ANCESTOR_COMMIT=`git merge-base ${BASE_BRANCH} ${WORKING_BRANCH}`
echo `git log ${COMMON_ANCESTOR_COMMIT}.. --pretty=oneline --grep="${PREFIX}"`
else
echo `git log --pretty=oneline --grep="${PREFIX}"`
fi
}
parse_args() {
# parse options
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
# read arguments into global variables
BASE_BRANCH=$1
}
cmd_help() {
usage
exit 0
}

109
git-now-rebase Executable file → Normal file
View file

@ -1,66 +1,67 @@
#!/bin/sh
usage_exit() {
echo "Usage: git now rebase [-h] [-p] [-r remote] [base_branch] " 1>&2
exit 1
usage() {
echo "usage: git now rebase [<base_branch>]"
echo " git now rebase --push|-p [--remote|-r <remote>] [<base_branch>]"
}
#
# Options
#
while getopts "pr:h" GETOPTS
do
case $GETOPTS in
p) PUSH_FLAG=yes
;;
r) REMOTE_NAME=$OPTARG
;;
h) usage_exit
;;
*) usage_exit
;;
esac
done
shift $((OPTIND - 1))
PREFIX="from now"
WORKING_BRANCH=`git branch -l | grep "*" | cut -d " " -f 2`
cmd_default() {
parse_args "$@"
if [ $# -eq 0 ]
then
FIRST_NOW_COMMIT=`git log --pretty=oneline --grep="${PREFIX}" | tail -n 1 | cut -d " " -f 1`
INITIAL_COMMIT=`git log --pretty=oneline | tail -n 1 | cut -d " " -f 1`
WORKING_BRANCH=$(git_current_branch)
INITIAL_COMMIT=$(git_now_initial_commit)
if [ ${FIRST_NOW_COMMIT} != ${INITIAL_COMMIT} ]
then
echo "git rebase -i ${FIRST_NOW_COMMIT}^"
if [ -n "$BASE_BRANCH" ]; then
COMMON_ANCESTOR_COMMIT=`git merge-base ${BASE_BRANCH} ${WORKING_BRANCH}`
FIRST_NOW_COMMIT=$(git_now_first_commit $COMMON_ANCESTOR_COMMIT)
if [ "$FIRST_NOW_COMMIT" != "$INITIAL_COMMIT" ]; then
git rebase -i ${FIRST_NOW_COMMIT}^
else
git checkout ${FIRST_NOW_COMMIT}
git commit --amend
git rebase --onto HEAD ${FIRST_NOW_COMMIT} ${WORKING_BRANCH}
fi
else
echo "git checkout ${FIRST_NOW_COMMIT}"
echo "git commit --amend"
echo "git rebase --onto HEAD ${FIRST_NOW_COMMIT} ${WORKING_BRANCH}"
FIRST_NOW_COMMIT=$(git_now_first_commit)
if [ "$FIRST_NOW_COMMIT" != "$INITIAL_COMMIT" ]; then
git rebase -i ${FIRST_NOW_COMMIT}^
else
git checkout ${FIRST_NOW_COMMIT}
git commit --amend
git rebase --onto HEAD ${FIRST_NOW_COMMIT} ${WORKING_BRANCH}
fi
fi
else
if flag push; then
_cmd_push $WORKING_BRANCH $REMOTE
fi
}
cmd_help() {
usage
exit 0
}
parse_args() {
# parse options
DEFINE_boolean 'push' false 'push to remote repository finally' 'p'
DEFINE_string 'remote' '' 'remote branch name to --set-upstream' 'r'
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
# read arguments into global variables
BASE_BRANCH=$1
COMMON_ANCESTOR_COMMIT=`git merge-base ${BASE_BRANCH} ${WORKING_BRANCH}`
FIRST_NOW_COMMIT=`git log ${COMMON_ANCESTOR_COMMIT}.. --pretty=oneline --grep="${PREFIX}" | tail -n 1 | cut -d " " -f 1`
INITIAL_COMMIT=`git log --pretty=oneline | tail -n 1 | cut -d " " -f 1`
REMOTE=$FLAGS_remote
}
if [ ${FIRST_NOW_COMMIT} != ${INITIAL_COMMIT} ]
then
echo "git rebase -i ${FIRST_NOW_COMMIT}^"
_cmd_push() {
local branch=$1
local remote=$2
if [ -n "$remote" ]; then
git push --set-upstream ${remote} ${branch}
else
echo "git checkout ${FIRST_NOW_COMMIT}"
echo "git commit --amend"
echo "git rebase --onto HEAD ${FIRST_NOW_COMMIT} ${WORKING_BRANCH}"
git push
fi
fi
}
if [ $PUSH_FLAG ]
then
if [ $REMOTE_NAME ]
then
echo "git push --set-upstream ${WORKING_BRANCH} ${REMOTE_NAME}/${WORKING_BRANCH}"
else
echo "git push"
fi
fi

View file

@ -1,7 +1,17 @@
require 'formula'
class GitNow < GithubGistFormula
url 'https://gist.github.com/raw/1167062/03c52077ce8c7fb72537bdf9cbd50bd11f3a9d5c/git-now'
md5 '72a36ca8deb21b7cc26b8a8f5dc3e7be'
homepage 'https://gist.github.com/1167062'
class GitNow < Formula
url 'https://github.com/iwata/git-now.git', :tag => 'v0.0.1'
version '0.0.1'
head 'https://github.com/iwata/git-now.git', :branch => 'develop'
homepage 'https://github.com/iwata/git-now'
# for longopt
depends_on 'gnu-getopt'
def install
system "make", "prefix=#{prefix}", "install"
system "brew ln gnu-getopt"
end
end

52
gitnow-common Normal file
View file

@ -0,0 +1,52 @@
#
# Common functionality
#
# shell output
warn() { echo "$@" >&2; }
die() { warn "$@"; exit 1; }
escape() {
echo "$1" | sed 's/\([\.\+\$\*]\)/\\\1/g'
}
# set logic
has() {
local item=$1; shift
echo " $@ " | grep -q " $(escape $item) "
}
# basic math
min() { [ "$1" -le "$2" ] && echo "$1" || echo "$2"; }
max() { [ "$1" -ge "$2" ] && echo "$1" || echo "$2"; }
# basic string matching
startswith() { [ "$1" != "${1#$2}" ]; }
endswith() { [ "$1" != "${1%$2}" ]; }
# convenience functions for checking shFlags flags
flag() { local FLAG; eval FLAG='$FLAGS_'$1; [ $FLAG -eq $FLAGS_TRUE ]; }
noflag() { local FLAG; eval FLAG='$FLAGS_'$1; [ $FLAG -ne $FLAGS_TRUE ]; }
#
# Git specific common functionality
#
git_local_branches() { git branch --no-color | sed 's/^[* ] //'; }
git_remote_branches() { git branch -r --no-color | sed 's/^[* ] //'; }
git_all_branches() { ( git branch --no-color; git branch -r --no-color) | sed 's/^[* ] //'; }
git_current_branch() {
git branch -l | grep "*" | cut -d " " -f 2
}
git_now_first_commit() {
local common=$1
if [ $# -eq 1 ]; then
git log ${common}.. --pretty=oneline --grep="${PREFIX}" | tail -n 1 | cut -d " " -f 1
else
git log --pretty=oneline --grep="${PREFIX}" | tail -n 1 | cut -d " " -f 1
fi
}
git_now_initial_commit() { git log --pretty=oneline | tail -n 1 | cut -d " " -f 1; }

1
gitnow-shFlags Symbolic link
View file

@ -0,0 +1 @@
shFlags/src/shflags

1
shFlags Submodule

@ -0,0 +1 @@
Subproject commit 2fb06af13de884e9680f14a00c82e52a67c867f1

12
update
View file

@ -1,12 +0,0 @@
#!/bin/sh
PREFIX="from now"
if [ ! "`git log --pretty=oneline $3 | head -n 1 | grep "${PREFIX}"`" ]
then
exit 0
else
echo "error: There are tmp log messages in the received objects." 1>&2
echo "error: Change these messages by 'git now --rebase'." 1>&2
exit 1
fi