9 if test "$me" = zit ; then
16 USAGE="usage: zit COMMAND FILE [ARGS...]"
26 echo "usage: zit list"
27 echo "Show tracked files, with a one-letter prefix indicating their status:"
30 echo " R removed/deleted"
31 echo " C modified/changed"
32 echo " K to be killed"
36 echo "usage: zit import FILE"
37 echo "Import history from an RCS-tracked file. Requires rcs-fast-export."
40 echo "usage: zit view FILE"
41 echo "Browse FILE's history with gitk (if possible) or tig."
44 echo "usage: zit with FILE COMMAND..."
45 echo "Run COMMAND after setting up the git environment for FILE."
50 echo "Set up a git repository under .zit.FILE to track changes for FILE."
51 echo "File must be a regular file and in the current directory."
54 echo " import Import RCS history for FILE"
55 echo " init Synonym for track"
56 echo " list Synonym for tracked"
57 echo " track Start tracking changes to FILE"
58 echo " tracked List tracked files in current directory"
59 echo " view Browse FILE's history with gitk or tig"
60 echo " with Run a command in FILE's context"
62 echo "See 'zit help git' or 'git help' for git commands."
65 echo "usage: zig FILE"
66 echo "Browse FILE's history with tig."
69 echo "usage: zik FILE"
70 echo "Browse FILE's history with gitk."
79 test $ZIT_FILE || abort "Please specify a file"
80 test -f $ZIT_FILE || abort "No such file $ZIT_FILE"
81 test $ZIT_FILE = "`basename $ZIT_FILE`" || abort "Sorry, Zit only works on files in the current directory"
83 export GIT_WORK_TREE="`pwd`"
85 # first, check if a repo exists already, looking for
86 # .zit/file.git or .file.git, in that order
87 # if neither is found, and .zit exists, set the repo dir
88 # to .zit/file.git, otherwise set it to .file.git
89 GIT_DIR="$ZIT_DIR/$ZIT_FILE.git"
90 if ! test -d "$GIT_DIR"; then
91 GIT_DIR=".$ZIT_FILE.git"
92 if ! test -d "$GIT_DIR"; then
93 test -d "$ZIT_DIR" && GIT_DIR="$ZIT_DIR/$ZIT_FILE.git"
99 # initialize the zitdir, without actually making the first commit
102 test -e $GIT_DIR && abort "$GIT_DIR exists, is $ZIT_FILE tracked already?"
103 mkdir $GIT_DIR && echo "Initializing Zit repository in $GIT_DIR"
104 test -d $GIT_DIR || abort "Failed to create $GIT_DIR"
105 git init || abort "Failed to initialize Git repository in $GIT_DIR"
106 rm -rf $GIT_DIR/{hooks,info,branches,refs/tags,objects/pack,description}
107 if test -d "$ZIT_DIR"; then
108 ZIT_EXCLUDE="$ZIT_DIR/exclude"
110 ZIT_EXCLUDE="$GIT_DIR/exclude"
112 if ! test -f "$ZIT_EXCLUDE"; then
113 touch "$ZIT_EXCLUDE" || abort "Cannot create $ZIT_EXCLUDE file"
114 echo "# Ignore patterns used by Zit repositories in the parent worktree." > "$ZIT_EXCLUDE"
115 echo "# By default it's the single '*' glob, since we want to ignore all" >> "$ZIT_EXCLUDE"
116 echo "# non-tracked files in the work-tree." >> "$ZIT_EXCLUDE"
117 echo "# This file is autogenerated and there's usually no need to edit it." >> "$ZIT_EXCLUDE"
118 echo "*" >> "$ZIT_EXCLUDE"
120 git config core.excludesfile "$ZIT_EXCLUDE"
126 git add -f $ZIT_FILE || abort "Failed to add $ZIT_FILE"
127 git commit "$@" || abort "Failed to make first commit for $ZIT_FILE"
129 if test -d "$ZIT_DIR"; then
130 echo "$ZIT_DIR exists already"
133 test -e $ZIT_DIR && abort "$ZIT_DIR exists but it's not a directory, cannot continue"
139 export GIT_WORK_TREE="`pwd`"
141 for file in "$ZIT_DIR"/*.git .*.git; do
142 if ! test -e $file; then
145 export GIT_DIR="$file"
149 (git ls-files -m -d -t; git ls-files -t) | uniq -f 1
151 # if $GIT_DIR is empty, no files were found
152 test "$GIT_DIR" || echo "(no files tracked by zit)"
155 # import an RCS-tracked file using rcs-fast-export, if found
157 which rcs-fast-export || abort "rcs-fast-export not found, I can't import RCS-tracked files, sorry"
159 # git-fast-import creates a pack file, so (re)build the objects/pack dir
160 mkdir -p $GIT_DIR/objects/pack
161 rcs-fast-export $1 | git-fast-import
162 # for some reason, rcs-fast-export | git-fast-import leaves the original
163 # file in 'deleted' state, a situation which is easily fixed by adding
187 if test -n "$DISPLAY" -a -n "$(which gitk)" ; then
189 elif test -n "$(which tig)" ; then
192 abort "Neither gitk or tig could be launched"
210 # Most commands will work with the generic catch-all mechanism used
211 # below, but some of them require a more thorough analysis of the
212 # parameters to decide whether $ZIT_FILE should be put back into the
213 # parameter list or not. For example,
214 # $ zit commit somefile
215 # wouldn't do what one expects it to do, unless 'add' is run first,
218 # wouldn't work either), however
219 # $ zit commit somefile -a
220 # would work correctly. So we handle some commands separately (for the
221 # moment just add and commit)
225 git $cmd "$@" "$ZIT_FILE"
227 # the raw<command> method can be used to not replicate $ZIT_FILE in the