2 * "git rm" builtin command
4 * Copyright (C) Linus Torvalds 2006
9 #include "cache-tree.h"
11 static const char builtin_rm_usage
[] =
12 "git-rm [-n] [-v] [-f] <filepattern>...";
19 static void add_list(const char *name
)
21 if (list
.nr
>= list
.alloc
) {
22 list
.alloc
= alloc_nr(list
.alloc
);
23 list
.name
= xrealloc(list
.name
, list
.alloc
* sizeof(const char *));
25 list
.name
[list
.nr
++] = name
;
28 static int remove_file(const char *name
)
34 if (!ret
&& (slash
= strrchr(name
, '/'))) {
35 char *n
= strdup(name
);
39 } while (!rmdir(name
) && (slash
= strrchr(name
, '/')));
44 static struct lock_file lock_file
;
46 int cmd_rm(int argc
, const char **argv
, const char *prefix
)
49 int verbose
= 0, show_only
= 0, force
= 0;
50 const char **pathspec
;
53 git_config(git_default_config
);
55 newfd
= hold_lock_file_for_update(&lock_file
, get_index_file());
57 die("unable to create new index file");
60 die("index file corrupt");
62 for (i
= 1 ; i
< argc
; i
++) {
63 const char *arg
= argv
[i
];
67 if (!strcmp(arg
, "--")) {
71 if (!strcmp(arg
, "-n")) {
75 if (!strcmp(arg
, "-v")) {
79 if (!strcmp(arg
, "-f")) {
83 die(builtin_rm_usage
);
86 usage(builtin_rm_usage
);
88 pathspec
= get_pathspec(prefix
, argv
+ i
);
90 for (i
= 0; pathspec
[i
] ; i
++)
94 for (i
= 0; i
< active_nr
; i
++) {
95 struct cache_entry
*ce
= active_cache
[i
];
96 if (!match_pathspec(pathspec
, ce
->name
, ce_namelen(ce
), 0, seen
))
103 for (i
= 0; (match
= pathspec
[i
]) != NULL
; i
++) {
104 if (*match
&& !seen
[i
])
105 die("pathspec '%s' did not match any files", match
);
110 * First remove the names from the index: we won't commit
111 * the index unless all of them succeed
113 for (i
= 0; i
< list
.nr
; i
++) {
114 const char *path
= list
.name
[i
];
115 printf("rm '%s'\n", path
);
117 if (remove_file_from_cache(path
))
118 die("git rm: unable to remove %s", path
);
119 cache_tree_invalidate_path(active_cache_tree
, path
);
126 * Then, if we used "-f", remove the filenames from the
127 * workspace. If we fail to remove the first one, we
128 * abort the "git rm" (but once we've successfully removed
129 * any file at all, we'll go ahead and commit to it all:
130 * by then we've already committed ourselves and can't fail
135 for (i
= 0; i
< list
.nr
; i
++) {
136 const char *path
= list
.name
[i
];
137 if (!remove_file(path
)) {
142 die("git rm: %s: %s", path
, strerror(errno
));
146 if (active_cache_changed
) {
147 if (write_cache(newfd
, active_cache
, active_nr
) ||
148 close(newfd
) || commit_lock_file(&lock_file
))
149 die("Unable to write new index file");