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."
48 echo "usage: zit clone REPO [FILE]"
49 echo "Create and track FILE, retrieving its history from repository REPO."
50 echo "FILE is guessed by REPO by stripping the '.git' suffix from the last path component"
55 echo "Set up a git repository under .zit.FILE to track changes for FILE."
56 echo "File must be a regular file and in the current directory."
59 echo " clone Clone and track a remote file"
60 echo " import Import RCS history for FILE"
61 echo " init Synonym for track"
62 echo " list Synonym for tracked"
63 echo " track Start tracking changes to FILE"
64 echo " tracked List tracked files in current directory"
65 echo " view Browse FILE's history with gitk or tig"
66 echo " with Run a command in FILE's context"
68 echo "See 'zit help git' or 'git help' for git commands."
71 echo "usage: zig FILE"
72 echo "Browse FILE's history with tig."
75 echo "usage: zik FILE"
76 echo "Browse FILE's history with gitk."
85 test $ZIT_FILE || abort "Please specify a file"
86 test -f $ZIT_FILE || abort "No such file $ZIT_FILE"
87 test $ZIT_FILE = "`basename $ZIT_FILE`" || abort "Sorry, Zit only works on files in the current directory"
89 export GIT_WORK_TREE="`pwd`"
91 # first, check if a repo exists already, looking for
92 # .zit/file.git or .file.git, in that order
93 # if neither is found, and .zit exists, set the repo dir
94 # to .zit/file.git, otherwise set it to .file.git
95 GIT_DIR="$ZIT_DIR/$ZIT_FILE.git"
96 if ! test -d "$GIT_DIR"; then
97 GIT_DIR=".$ZIT_FILE.git"
98 if ! test -d "$GIT_DIR"; then
99 test -d "$ZIT_DIR" && GIT_DIR="$ZIT_DIR/$ZIT_FILE.git"
105 # initialize the zitdir, without actually making the first commit
108 test -e $GIT_DIR && abort "$GIT_DIR exists, is $ZIT_FILE tracked already?"
109 mkdir $GIT_DIR && echo "Initializing Zit repository in $GIT_DIR"
110 test -d $GIT_DIR || abort "Failed to create $GIT_DIR"
111 git init || abort "Failed to initialize Git repository in $GIT_DIR"
112 rm -rf $GIT_DIR/{hooks,info,branches,refs/tags,objects/pack,description}
113 if test -d "$ZIT_DIR"; then
114 ZIT_EXCLUDE="$ZIT_DIR/exclude"
116 ZIT_EXCLUDE="$GIT_DIR/exclude"
118 if ! test -f "$ZIT_EXCLUDE"; then
119 touch "$ZIT_EXCLUDE" || abort "Cannot create $ZIT_EXCLUDE file"
120 echo "# Ignore patterns used by Zit repositories in the parent worktree." > "$ZIT_EXCLUDE"
121 echo "# By default it's the single '*' glob, since we want to ignore all" >> "$ZIT_EXCLUDE"
122 echo "# non-tracked files in the work-tree." >> "$ZIT_EXCLUDE"
123 echo "# This file is autogenerated and there's usually no need to edit it." >> "$ZIT_EXCLUDE"
124 echo "*" >> "$ZIT_EXCLUDE"
126 git config core.excludesfile "$ZIT_EXCLUDE"
132 git add -f $ZIT_FILE || abort "Failed to add $ZIT_FILE"
133 git commit "$@" || abort "Failed to make first commit for $ZIT_FILE"
135 if test -d "$ZIT_DIR"; then
136 echo "$ZIT_DIR exists already"
139 test -e $ZIT_DIR && abort "$ZIT_DIR exists but it's not a directory, cannot continue"
145 export GIT_WORK_TREE="`pwd`"
147 for file in "$ZIT_DIR"/*.git .*.git; do
148 if ! test -e $file; then
151 export GIT_DIR="$file"
155 (git ls-files -m -d -t; git ls-files -t) | uniq -f 1
157 # if $GIT_DIR is empty, no files were found
158 test "$GIT_DIR" || echo "(no files tracked by zit)"
161 # import an RCS-tracked file using rcs-fast-export, if found
163 which rcs-fast-export || abort "rcs-fast-export not found, I can't import RCS-tracked files, sorry"
165 # git-fast-import creates a pack file, so (re)build the objects/pack dir
166 mkdir -p $GIT_DIR/objects/pack
167 rcs-fast-export $1 | git-fast-import
168 # for some reason, rcs-fast-export | git-fast-import leaves the original
169 # file in 'deleted' state, a situation which is easily fixed by adding
176 test -n "$SRC" || abort "Where do you want to clone from?"
180 ZIT_FILE=`basename $SRC .git`
182 test -e "$ZIT_FILE" && abort "File $ZIT_FILE exists already"
183 test "$ZIT_FILE" = "`basename $ZIT_FILE`" || abort "Sorry, Zit only works on files in the current directory"
184 touch "$ZIT_FILE" # to make zit_setup happy
185 zitdir_init "$ZIT_FILE"
187 git remote add origin "$SRC"
190 git checkout -b master origin/master
215 if test -n "$DISPLAY" -a -n "$(which gitk)" ; then
217 elif test -n "$(which tig)" ; then
220 abort "Neither gitk or tig could be launched"
238 # Most commands will work with the generic catch-all mechanism used
239 # below, but some of them require a more thorough analysis of the
240 # parameters to decide whether $ZIT_FILE should be put back into the
241 # parameter list or not. For example,
242 # $ zit commit somefile
243 # wouldn't do what one expects it to do, unless 'add' is run first,
246 # wouldn't work either), however
247 # $ zit commit somefile -a
248 # would work correctly. So we handle some commands separately (for the
249 # moment just add and commit)
253 git $cmd "$@" "$ZIT_FILE"
255 # the raw<command> method can be used to not replicate $ZIT_FILE in the