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(), 1);
58 die("index file corrupt");
60 for (i
= 1 ; i
< argc
; i
++) {
61 const char *arg
= argv
[i
];
65 if (!strcmp(arg
, "--")) {
69 if (!strcmp(arg
, "-n")) {
73 if (!strcmp(arg
, "-v")) {
77 if (!strcmp(arg
, "-f")) {
81 usage(builtin_rm_usage
);
84 usage(builtin_rm_usage
);
86 pathspec
= get_pathspec(prefix
, argv
+ i
);
88 for (i
= 0; pathspec
[i
] ; i
++)
92 for (i
= 0; i
< active_nr
; i
++) {
93 struct cache_entry
*ce
= active_cache
[i
];
94 if (!match_pathspec(pathspec
, ce
->name
, ce_namelen(ce
), 0, seen
))
101 for (i
= 0; (match
= pathspec
[i
]) != NULL
; i
++) {
102 if (*match
&& !seen
[i
])
103 die("pathspec '%s' did not match any files", match
);
108 * First remove the names from the index: we won't commit
109 * the index unless all of them succeed
111 for (i
= 0; i
< list
.nr
; i
++) {
112 const char *path
= list
.name
[i
];
113 printf("rm '%s'\n", path
);
115 if (remove_file_from_cache(path
))
116 die("git-rm: unable to remove %s", path
);
117 cache_tree_invalidate_path(active_cache_tree
, path
);
124 * Then, if we used "-f", remove the filenames from the
125 * workspace. If we fail to remove the first one, we
126 * abort the "git rm" (but once we've successfully removed
127 * any file at all, we'll go ahead and commit to it all:
128 * by then we've already committed ourselves and can't fail
133 for (i
= 0; i
< list
.nr
; i
++) {
134 const char *path
= list
.name
[i
];
135 if (!remove_file(path
)) {
140 die("git-rm: %s: %s", path
, strerror(errno
));
144 if (active_cache_changed
) {
145 if (write_cache(newfd
, active_cache
, active_nr
) ||
146 close(newfd
) || commit_lock_file(&lock_file
))
147 die("Unable to write new index file");